From 6b6addcddb4146bb4165a4156e5dfedc0ef0682a Mon Sep 17 00:00:00 2001 From: TENSIILE Date: Wed, 18 Mar 2026 15:15:11 +0300 Subject: [PATCH 01/21] chore: adds prettier (#3) --- .prettierignore | 4 ++++ .prettierrc | 13 +++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 .prettierignore create mode 100644 .prettierrc diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..fb6c68a --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +dist +coverage +**/.git +**/node_modules \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..183c7a1 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,13 @@ +{ + "semi": true, + "tabWidth": 2, + "printWidth": 120, + "singleQuote": true, + "endOfLine": "lf", + "trailingComma": "none", + "jsxSingleQuote": true, + "bracketSpacing": true, + "useTabs": false, + "jsxBracketSameLine": false, + "arrowParens": "always" +} From 5c0fef48b23a0f8842424c0fab98214af3b906e4 Mon Sep 17 00:00:00 2001 From: TENSIILE Date: Wed, 18 Mar 2026 15:16:23 +0300 Subject: [PATCH 02/21] chore: adds eslint (#3) --- .eslintrc | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 .eslintrc diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..2d87807 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,51 @@ +{ + "root": true, + "env": { "browser": true, "es2020": true, "jest": true }, + "extends": ["eslint:recommended", "airbnb", "plugin:import/typescript", "plugin:prettier/recommended"], + "parser": "@typescript-eslint/parser", + "ignorePatterns": [ + "**/dist/", + "**/node_modules/", + "**/*.json", + "**/*.html", + "/**/coverage/", + "**/integrations/**/", + "./vite.config.js" + ], + "plugins": ["@typescript-eslint", "prettier"], + "rules": { + "no-continue": "off", + "quotes": "off", + "import/prefer-default-export": ["off"], + "class-methods-use-this": ["off"], + "func-names": ["off"], + "no-plusplus": ["off"], + "prefer-spread": ["off"], + "consistent-return": ["off"], + "newline-before-return": "warn", + "default-case": ["off"], + "comma-dangle": ["off"], + "import/extensions": ["off"], + "max-len": ["off"], + "no-console": ["warn", { "allow": ["warn", "error"] }], + "@typescript-eslint/lines-between-class-members": ["off", {}], + "import/no-extraneous-dependencies": ["off"], + "@typescript-eslint/no-unused-vars": ["off", {}], + "no-unused-vars": ["off"], + "prettier/prettier": [ + "error", + { + "arrowParens": "always", + "endOfLine": "auto" + } + ] + }, + "overrides": [ + { + "files": ["*.ts", "*.tsx"], + "rules": { + "no-undef": "off" + } + } + ] + } \ No newline at end of file From 5e78f49674024b3cf91a29a7fdb21b0e947c9076 Mon Sep 17 00:00:00 2001 From: TENSIILE Date: Wed, 18 Mar 2026 15:16:47 +0300 Subject: [PATCH 03/21] chore: adds cspell config (#3) --- cspell.json | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 cspell.json diff --git a/cspell.json b/cspell.json new file mode 100644 index 0000000..aa74856 --- /dev/null +++ b/cspell.json @@ -0,0 +1,36 @@ +{ + "version": "0.2", + "language": "en,ru", + "words": ["Saborter", "saborter", "Laptev", "Vladislav", "tgz", "Сalls"], + "flagWords": [], + "ignorePaths": [ + "node_modules/**", + "dist/**", + "build/**", + ".git/**", + "coverage/**", + "*.log", + "package-lock.json", + "./**/*.test.ts", + "./cspell.json", + "./integrations" + ], + "dictionaries": ["typescript", "node", "softwareTerms", "en_US", "ru_RU"], + "useGitignore": true, + "patterns": [ + { + "name": "markdown-links", + "pattern": "\\(.*\\)", + "description": "Ignore URLs in Markdown" + }, + { + "name": "html-entities", + "pattern": "&\\w+;", + "description": "Ignore HTML entities" + } + ], + "ignoreRegExpList": ["/\\[.*\\]\\(.*\\)/g", "/&[a-z]+;/g", "/0x[a-fA-F0-9]+/g", "/\\$[^{][\\w.]+/g"], + "caseSensitive": false, + "allowCompoundWords": true, + "minWordLength": 3 +} From 64b0269f79a7ea0f0f7b2612b3a7bda4c4870d6e Mon Sep 17 00:00:00 2001 From: TENSIILE Date: Wed, 18 Mar 2026 15:17:48 +0300 Subject: [PATCH 04/21] chore: installs dev packages (#3) --- package-lock.json | 6165 ++++++++++++++++++++++++++++++++++++++++----- package.json | 30 +- 2 files changed, 5632 insertions(+), 563 deletions(-) diff --git a/package-lock.json b/package-lock.json index d55108d..647c79f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,695 +15,4369 @@ "@types/cors": "^2.8.19", "@types/express": "^5.0.6", "@types/node": "^25.5.0", + "@typescript-eslint/eslint-plugin": "^8.50.1", + "@typescript-eslint/parser": "^8.50.1", "cors": "^2.8.6", + "cspell": "^9.6.2", + "eslint": "^8.11.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-prettier": "^5.5.4", + "husky": "^9.1.7", "nodemon": "^3.1.14", + "prettier": "^3.7.4", "ts-node": "^10.9.2", "typescript": "^5.9.3" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "node_modules/@cspell/cspell-bundled-dicts": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-9.7.0.tgz", + "integrity": "sha512-s7h1vo++Q3AsfQa3cs0u/KGwm3SYInuIlC4kjlCBWjQmb4KddiZB5O1u0+3TlA7GycHb5M4CR7MDfHUICgJf+w==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "@cspell/dict-ada": "^4.1.1", + "@cspell/dict-al": "^1.1.1", + "@cspell/dict-aws": "^4.0.17", + "@cspell/dict-bash": "^4.2.2", + "@cspell/dict-companies": "^3.2.10", + "@cspell/dict-cpp": "^7.0.2", + "@cspell/dict-cryptocurrencies": "^5.0.5", + "@cspell/dict-csharp": "^4.0.8", + "@cspell/dict-css": "^4.0.19", + "@cspell/dict-dart": "^2.3.2", + "@cspell/dict-data-science": "^2.0.13", + "@cspell/dict-django": "^4.1.6", + "@cspell/dict-docker": "^1.1.17", + "@cspell/dict-dotnet": "^5.0.12", + "@cspell/dict-elixir": "^4.0.8", + "@cspell/dict-en_us": "^4.4.29", + "@cspell/dict-en-common-misspellings": "^2.1.12", + "@cspell/dict-en-gb-mit": "^3.1.18", + "@cspell/dict-filetypes": "^3.0.15", + "@cspell/dict-flutter": "^1.1.1", + "@cspell/dict-fonts": "^4.0.5", + "@cspell/dict-fsharp": "^1.1.1", + "@cspell/dict-fullstack": "^3.2.8", + "@cspell/dict-gaming-terms": "^1.1.2", + "@cspell/dict-git": "^3.1.0", + "@cspell/dict-golang": "^6.0.26", + "@cspell/dict-google": "^1.0.9", + "@cspell/dict-haskell": "^4.0.6", + "@cspell/dict-html": "^4.0.14", + "@cspell/dict-html-symbol-entities": "^4.0.5", + "@cspell/dict-java": "^5.0.12", + "@cspell/dict-julia": "^1.1.1", + "@cspell/dict-k8s": "^1.0.12", + "@cspell/dict-kotlin": "^1.1.1", + "@cspell/dict-latex": "^5.0.0", + "@cspell/dict-lorem-ipsum": "^4.0.5", + "@cspell/dict-lua": "^4.0.8", + "@cspell/dict-makefile": "^1.0.5", + "@cspell/dict-markdown": "^2.0.14", + "@cspell/dict-monkeyc": "^1.0.12", + "@cspell/dict-node": "^5.0.9", + "@cspell/dict-npm": "^5.2.34", + "@cspell/dict-php": "^4.1.1", + "@cspell/dict-powershell": "^5.0.15", + "@cspell/dict-public-licenses": "^2.0.15", + "@cspell/dict-python": "^4.2.25", + "@cspell/dict-r": "^2.1.1", + "@cspell/dict-ruby": "^5.1.0", + "@cspell/dict-rust": "^4.1.2", + "@cspell/dict-scala": "^5.0.9", + "@cspell/dict-shell": "^1.1.2", + "@cspell/dict-software-terms": "^5.1.21", + "@cspell/dict-sql": "^2.2.1", + "@cspell/dict-svelte": "^1.0.7", + "@cspell/dict-swift": "^2.0.6", + "@cspell/dict-terraform": "^1.1.3", + "@cspell/dict-typescript": "^3.2.3", + "@cspell/dict-vue": "^3.0.5", + "@cspell/dict-zig": "^1.0.0" }, "engines": { - "node": ">=12" + "node": ">=20" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@cspell/cspell-json-reporter": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-9.7.0.tgz", + "integrity": "sha512-6xpGXlMtQA3hV2BCAQcPkpx9eI12I0o01i9eRqSSEDKtxuAnnrejbcCpL+5OboAjTp3/BSeNYSnhuWYLkSITWQ==", "dev": true, "license": "MIT", + "dependencies": { + "@cspell/cspell-types": "9.7.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=20" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "node_modules/@cspell/cspell-performance-monitor": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-performance-monitor/-/cspell-performance-monitor-9.7.0.tgz", + "integrity": "sha512-w1PZIFXuvjnC6mQHyYAFnrsn5MzKnEcEkcK1bj4OG00bAt7WX2VUA/eNNt9c1iHozCQ+FcRYlfbGxuBmNyzSgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18" + } + }, + "node_modules/@cspell/cspell-pipe": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-9.7.0.tgz", + "integrity": "sha512-iiisyRpJciU9SOHNSi0ZEK0pqbEMFRatI/R4O+trVKb+W44p4MNGClLVRWPGUmsFbZKPJL3jDtz0wPlG0/JCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-resolver": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-9.7.0.tgz", + "integrity": "sha512-uiEgS238mdabDnwavo6HXt8K98jlh/jpm7NONroM9NTr9rzck2VZKD2kXEj85wDNMtRsRXNoywTjwQ8WTB6/+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-directory": "^5.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-service-bus": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-9.7.0.tgz", + "integrity": "sha512-fkqtaCkg4jY/FotmzjhIavbXuH0AgUJxZk78Ktf4XlhqOZ4wDeUWrCf220bva4mh3TWiLx/ae9lIlpl59Vx6hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-types": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-9.7.0.tgz", + "integrity": "sha512-Tdfx4eH2uS+gv9V9NCr3Rz+c7RSS6ntXp3Blliud18ibRUlRxO9dTaOjG4iv4x0nAmMeedP1ORkEpeXSkh2QiQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-worker": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-worker/-/cspell-worker-9.7.0.tgz", + "integrity": "sha512-cjEApFF0aOAa1vTUk+e7xP8ofK7iC7hsRzj1FmvvVQz8PoLWPRaq+1bT89ypPsZQvavqm5sIgb97S60/aW4TVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cspell-lib": "9.7.0" + }, + "engines": { + "node": ">=20.18" + } + }, + "node_modules/@cspell/dict-ada": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.1.1.tgz", + "integrity": "sha512-E+0YW9RhZod/9Qy2gxfNZiHJjCYFlCdI69br1eviQQWB8yOTJX0JHXLs79kOYhSW0kINPVUdvddEBe6Lu6CjGQ==", "dev": true, "license": "MIT" }, - "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==", + "node_modules/@cspell/dict-al": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-al/-/dict-al-1.1.1.tgz", + "integrity": "sha512-sD8GCaZetgQL4+MaJLXqbzWcRjfKVp8x+px3HuCaaiATAAtvjwUQ5/Iubiqwfd1boIh2Y1/3EgM3TLQ7Q8e0wQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-aws": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-4.0.17.tgz", + "integrity": "sha512-ORcblTWcdlGjIbWrgKF+8CNEBQiLVKdUOFoTn0KPNkAYnFcdPP0muT4892h7H4Xafh3j72wqB4/loQ6Nti9E/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-bash": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.2.2.tgz", + "integrity": "sha512-kyWbwtX3TsCf5l49gGQIZkRLaB/P8g73GDRm41Zu8Mv51kjl2H7Au0TsEvHv7jzcsRLS6aUYaZv6Zsvk1fOz+Q==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@cspell/dict-shell": "1.1.2" } }, - "node_modules/@tsconfig/node10": { + "node_modules/@cspell/dict-companies": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.2.11.tgz", + "integrity": "sha512-0cmafbcz2pTHXLd59eLR1gvDvN6aWAOM0+cIL4LLF9GX9yB2iKDNrKsvs4tJRqutoaTdwNFBbV0FYv+6iCtebQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-cpp": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-7.0.2.tgz", + "integrity": "sha512-dfbeERiVNeqmo/npivdR6rDiBCqZi3QtjH2Z0HFcXwpdj6i97dX1xaKyK2GUsO/p4u1TOv63Dmj5Vm48haDpuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-cryptocurrencies": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-5.0.5.tgz", + "integrity": "sha512-R68hYYF/rtlE6T/dsObStzN5QZw+0aQBinAXuWCVqwdS7YZo0X33vGMfChkHaiCo3Z2+bkegqHlqxZF4TD3rUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-csharp": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-4.0.8.tgz", + "integrity": "sha512-qmk45pKFHSxckl5mSlbHxmDitSsGMlk/XzFgt7emeTJWLNSTUK//MbYAkBNRtfzB4uD7pAFiKgpKgtJrTMRnrQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-css": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.1.1.tgz", + "integrity": "sha512-y/Vgo6qY08e1t9OqR56qjoFLBCpi4QfWMf2qzD1l9omRZwvSMQGRPz4x0bxkkkU4oocMAeztjzCsmLew//c/8w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-dart": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.3.2.tgz", + "integrity": "sha512-sUiLW56t9gfZcu8iR/5EUg+KYyRD83Cjl3yjDEA2ApVuJvK1HhX+vn4e4k4YfjpUQMag8XO2AaRhARE09+/rqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-data-science": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-2.0.13.tgz", + "integrity": "sha512-l1HMEhBJkPmw4I2YGVu2eBSKM89K9pVF+N6qIr5Uo5H3O979jVodtuwP8I7LyPrJnC6nz28oxeGRCLh9xC5CVA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-django": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.1.6.tgz", + "integrity": "sha512-SdbSFDGy9ulETqNz15oWv2+kpWLlk8DJYd573xhIkeRdcXOjskRuxjSZPKfW7O3NxN/KEf3gm3IevVOiNuFS+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-docker": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.17.tgz", + "integrity": "sha512-OcnVTIpHIYYKhztNTyK8ShAnXTfnqs43hVH6p0py0wlcwRIXe5uj4f12n7zPf2CeBI7JAlPjEsV0Rlf4hbz/xQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-dotnet": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.12.tgz", + "integrity": "sha512-FiV934kNieIjGTkiApu/WKvLYi/KBpvfWB2TSqpDQtmXZlt3uSa5blwblO1ZC8OvjH8RCq/31H5IdEYmTaZS7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-elixir": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.8.tgz", + "integrity": "sha512-CyfphrbMyl4Ms55Vzuj+mNmd693HjBFr9hvU+B2YbFEZprE5AG+EXLYTMRWrXbpds4AuZcvN3deM2XVB80BN/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-en_us": { + "version": "4.4.31", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.4.31.tgz", + "integrity": "sha512-MdV6mbrSkyIqn9+6F5poCyHIPqWB3H/wlDL9LXfjgAxNFBdYRE767xJtIYunzUqhUiJHSJgZajEFdTtMDw441Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-en-common-misspellings": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.1.12.tgz", + "integrity": "sha512-14Eu6QGqyksqOd4fYPuRb58lK1Va7FQK9XxFsRKnZU8LhL3N+kj7YKDW+7aIaAN/0WGEqslGP6lGbQzNti8Akw==", + "dev": true, + "license": "CC BY-SA 4.0" + }, + "node_modules/@cspell/dict-en-gb-mit": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb-mit/-/dict-en-gb-mit-3.1.20.tgz", + "integrity": "sha512-rcWEKb1mwgK13CSHu6GwwFA/sWLRkB0twTzSfPxUOULJkhcUrL93ixohk416SBa0BVxixub+lOpTXKcCTbTXsA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-filetypes": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.17.tgz", + "integrity": "sha512-6f1gZf9o60fGQXGi/fZaryISUNDRmmJwGyr4QU1UvgUgOdpDHLVJtv/0wSL9q5F0wAkYhbXo/fNG8CcUTaf7Ww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-flutter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-flutter/-/dict-flutter-1.1.1.tgz", + "integrity": "sha512-UlOzRcH2tNbFhZmHJN48Za/2/MEdRHl2BMkCWZBYs+30b91mWvBfzaN4IJQU7dUZtowKayVIF9FzvLZtZokc5A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-fonts": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-4.0.6.tgz", + "integrity": "sha512-aR/0csY01dNb0A1tw/UmN9rKgHruUxsYsvXu6YlSBJFu60s26SKr/k1o4LavpHTQ+lznlYMqAvuxGkE4Flliqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-fsharp": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-fsharp/-/dict-fsharp-1.1.1.tgz", + "integrity": "sha512-imhs0u87wEA4/cYjgzS0tAyaJpwG7vwtC8UyMFbwpmtw+/bgss+osNfyqhYRyS/ehVCWL17Ewx2UPkexjKyaBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-fullstack": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-3.2.8.tgz", + "integrity": "sha512-J6EeoeThvx/DFrcA2rJiCA6vfqwJMbkG0IcXhlsmRZmasIpanmxgt90OEaUazbZahFiuJT8wrhgQ1QgD1MsqBw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-gaming-terms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.1.2.tgz", + "integrity": "sha512-9XnOvaoTBscq0xuD6KTEIkk9hhdfBkkvJAIsvw3JMcnp1214OCGW8+kako5RqQ2vTZR3Tnf3pc57o7VgkM0q1Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-git": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-3.1.0.tgz", + "integrity": "sha512-KEt9zGkxqGy2q1nwH4CbyqTSv5nadpn8BAlDnzlRcnL0Xb3LX9xTgSGShKvzb0bw35lHoYyLWN2ZKAqbC4pgGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-golang": { + "version": "6.0.26", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.26.tgz", + "integrity": "sha512-YKA7Xm5KeOd14v5SQ4ll6afe9VSy3a2DWM7L9uBq4u3lXToRBQ1W5PRa+/Q9udd+DTURyVVnQ+7b9cnOlNxaRg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-google": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-google/-/dict-google-1.0.9.tgz", + "integrity": "sha512-biL65POqialY0i4g6crj7pR6JnBkbsPovB2WDYkj3H4TuC/QXv7Pu5pdPxeUJA6TSCHI7T5twsO4VSVyRxD9CA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-haskell": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-4.0.6.tgz", + "integrity": "sha512-ib8SA5qgftExpYNjWhpYIgvDsZ/0wvKKxSP+kuSkkak520iPvTJumEpIE+qPcmJQo4NzdKMN8nEfaeci4OcFAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-html": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.15.tgz", + "integrity": "sha512-GJYnYKoD9fmo2OI0aySEGZOjThnx3upSUvV7mmqUu8oG+mGgzqm82P/f7OqsuvTaInZZwZbo+PwJQd/yHcyFIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-html-symbol-entities": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.5.tgz", + "integrity": "sha512-429alTD4cE0FIwpMucvSN35Ld87HCyuM8mF731KU5Rm4Je2SG6hmVx7nkBsLyrmH3sQukTcr1GaiZsiEg8svPA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-java": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.12.tgz", + "integrity": "sha512-qPSNhTcl7LGJ5Qp6VN71H8zqvRQK04S08T67knMq9hTA8U7G1sTKzLmBaDOFhq17vNX/+rT+rbRYp+B5Nwza1A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-julia": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-julia/-/dict-julia-1.1.1.tgz", + "integrity": "sha512-WylJR9TQ2cgwd5BWEOfdO3zvDB+L7kYFm0I9u0s9jKHWQ6yKmfKeMjU9oXxTBxIufhCXm92SKwwVNAC7gjv+yA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-k8s": { "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", - "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.12.tgz", + "integrity": "sha512-2LcllTWgaTfYC7DmkMPOn9GsBWsA4DZdlun4po8s2ysTP7CPEnZc1ZfK6pZ2eI4TsZemlUQQ+NZxMe9/QutQxg==", "dev": true, "license": "MIT" }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "node_modules/@cspell/dict-kotlin": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-kotlin/-/dict-kotlin-1.1.1.tgz", + "integrity": "sha512-J3NzzfgmxRvEeOe3qUXnSJQCd38i/dpF9/t3quuWh6gXM+krsAXP75dY1CzDmS8mrJAlBdVBeAW5eAZTD8g86Q==", "dev": true, "license": "MIT" }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "node_modules/@cspell/dict-latex": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-5.1.0.tgz", + "integrity": "sha512-qxT4guhysyBt0gzoliXYEBYinkAdEtR2M7goRaUH0a7ltCsoqqAeEV8aXYRIdZGcV77gYSobvu3jJL038tlPAw==", "dev": true, "license": "MIT" }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "node_modules/@cspell/dict-lorem-ipsum": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-4.0.5.tgz", + "integrity": "sha512-9a4TJYRcPWPBKkQAJ/whCu4uCAEgv/O2xAaZEI0n4y1/l18Yyx8pBKoIX5QuVXjjmKEkK7hi5SxyIsH7pFEK9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-lua": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.8.tgz", + "integrity": "sha512-N4PkgNDMu9JVsRu7JBS/3E/dvfItRgk9w5ga2dKq+JupP2Y3lojNaAVFhXISh4Y0a6qXDn2clA6nvnavQ/jjLA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-makefile": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-makefile/-/dict-makefile-1.0.5.tgz", + "integrity": "sha512-4vrVt7bGiK8Rx98tfRbYo42Xo2IstJkAF4tLLDMNQLkQ86msDlYSKG1ZCk8Abg+EdNcFAjNhXIiNO+w4KflGAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-markdown": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@cspell/dict-markdown/-/dict-markdown-2.0.16.tgz", + "integrity": "sha512-976RRqKv6cwhrxdFCQP2DdnBVB86BF57oQtPHy4Zbf4jF/i2Oy29MCrxirnOBalS1W6KQeto7NdfDXRAwkK4PQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@cspell/dict-css": "^4.1.1", + "@cspell/dict-html": "^4.0.15", + "@cspell/dict-html-symbol-entities": "^4.0.5", + "@cspell/dict-typescript": "^3.2.3" + } + }, + "node_modules/@cspell/dict-monkeyc": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-monkeyc/-/dict-monkeyc-1.0.12.tgz", + "integrity": "sha512-MN7Vs11TdP5mbdNFQP5x2Ac8zOBm97ARg6zM5Sb53YQt/eMvXOMvrep7+/+8NJXs0jkp70bBzjqU4APcqBFNAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-node": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-5.0.9.tgz", + "integrity": "sha512-hO+ga+uYZ/WA4OtiMEyKt5rDUlUyu3nXMf8KVEeqq2msYvAPdldKBGH7lGONg6R/rPhv53Rb+0Y1SLdoK1+7wQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-npm": { + "version": "5.2.37", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.2.37.tgz", + "integrity": "sha512-dYKrD0bI08YgebJcbjsIDpTMK6EH0wTkEyQLsaH0T4tmsLJE95coTYb3eE7giRRGJADvBqrjH4fz5+INd85QqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-php": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.1.1.tgz", + "integrity": "sha512-EXelI+4AftmdIGtA8HL8kr4WlUE11OqCSVlnIgZekmTkEGSZdYnkFdiJ5IANSALtlQ1mghKjz+OFqVs6yowgWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-powershell": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.15.tgz", + "integrity": "sha512-l4S5PAcvCFcVDMJShrYD0X6Huv9dcsQPlsVsBGbH38wvuN7gS7+GxZFAjTNxDmTY1wrNi1cCatSg6Pu2BW4rgg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-public-licenses": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.16.tgz", + "integrity": "sha512-EQRrPvEOmwhwWezV+W7LjXbIBjiy6y/shrET6Qcpnk3XANTzfvWflf9PnJ5kId/oKWvihFy0za0AV1JHd03pSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-python": { + "version": "4.2.25", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.2.25.tgz", + "integrity": "sha512-hDdN0YhKgpbtZVRjQ2c8jk+n0wQdidAKj1Fk8w7KEHb3YlY5uPJ0mAKJk7AJKPNLOlILoUmN+HAVJz+cfSbWYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/dict-data-science": "^2.0.13" + } + }, + "node_modules/@cspell/dict-r": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-r/-/dict-r-2.1.1.tgz", + "integrity": "sha512-71Ka+yKfG4ZHEMEmDxc6+blFkeTTvgKbKAbwiwQAuKl3zpqs1Y0vUtwW2N4b3LgmSPhV3ODVY0y4m5ofqDuKMw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-ruby": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.1.1.tgz", + "integrity": "sha512-LHrp84oEV6q1ZxPPyj4z+FdKyq1XAKYPtmGptrd+uwHbrF/Ns5+fy6gtSi7pS+uc0zk3JdO9w/tPK+8N1/7WUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-rust": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.1.2.tgz", + "integrity": "sha512-O1FHrumYcO+HZti3dHfBPUdnDFkI+nbYK3pxYmiM1sr+G0ebOd6qchmswS0Wsc6ZdEVNiPYJY/gZQR6jfW3uOg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-scala": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.9.tgz", + "integrity": "sha512-AjVcVAELgllybr1zk93CJ5wSUNu/Zb5kIubymR/GAYkMyBdYFCZ3Zbwn4Zz8GJlFFAbazABGOu0JPVbeY59vGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-shell": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-shell/-/dict-shell-1.1.2.tgz", + "integrity": "sha512-WqOUvnwcHK1X61wAfwyXq04cn7KYyskg90j4lLg3sGGKMW9Sq13hs91pqrjC44Q+lQLgCobrTkMDw9Wyl9nRFA==", "dev": true, "license": "MIT" }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "node_modules/@cspell/dict-software-terms": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-5.2.0.tgz", + "integrity": "sha512-jyucc8KKxH5ClC4FPICISgcKAZU7UwgFdPkuuuK5nYIw0+l1umnUSn9IKCcOaurvXujvVP6mBfclXpUtmT6Vrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-sql": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.2.1.tgz", + "integrity": "sha512-qDHF8MpAYCf4pWU8NKbnVGzkoxMNrFqBHyG/dgrlic5EQiKANCLELYtGlX5auIMDLmTf1inA0eNtv74tyRJ/vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-svelte": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-svelte/-/dict-svelte-1.0.7.tgz", + "integrity": "sha512-hGZsGqP0WdzKkdpeVLBivRuSNzOTvN036EBmpOwxH+FTY2DuUH7ecW+cSaMwOgmq5JFSdTcbTNFlNC8HN8lhaQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-swift": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-2.0.6.tgz", + "integrity": "sha512-PnpNbrIbex2aqU1kMgwEKvCzgbkHtj3dlFLPMqW1vSniop7YxaDTtvTUO4zA++ugYAEL+UK8vYrBwDPTjjvSnA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-terraform": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-terraform/-/dict-terraform-1.1.3.tgz", + "integrity": "sha512-gr6wxCydwSFyyBKhBA2xkENXtVFToheqYYGFvlMZXWjviynXmh+NK/JTvTCk/VHk3+lzbO9EEQKee6VjrAUSbA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-typescript": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.2.3.tgz", + "integrity": "sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-vue": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-3.0.5.tgz", + "integrity": "sha512-Mqutb8jbM+kIcywuPQCCaK5qQHTdaByoEO2J9LKFy3sqAdiBogNkrplqUK0HyyRFgCfbJUgjz3N85iCMcWH0JA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-zig": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-zig/-/dict-zig-1.0.0.tgz", + "integrity": "sha512-XibBIxBlVosU06+M6uHWkFeT0/pW5WajDRYdXG2CgHnq85b0TI/Ks0FuBJykmsgi2CAD3Qtx8UHFEtl/DSFnAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dynamic-import": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-9.7.0.tgz", + "integrity": "sha512-Ws36IYvtS/8IN3x6K9dPLvTmaArodRJmzTn2Rkf2NaTnIYWhRuFzsP3SVVO59NN3fXswAEbmz5DSbVUe8bPZHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/url": "9.7.0", + "import-meta-resolve": "^4.2.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/filetypes": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@cspell/filetypes/-/filetypes-9.7.0.tgz", + "integrity": "sha512-Ln9e/8wGOyTeL3DCCs6kwd18TSpTw3kxsANjTrzLDASrX4cNmAdvc9J5dcIuBHPaqOAnRQxuZbzUlpRh73Y24w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/rpc": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@cspell/rpc/-/rpc-9.7.0.tgz", + "integrity": "sha512-VnZ4ABgQeoS4RwofcePkDP7L6tf3Kh5D7LQKoyRM4R6XtfSsYefym6XKaRl3saGtthH5YyjgNJ0Tgdjen4wAAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18" + } + }, + "node_modules/@cspell/strong-weak-map": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-9.7.0.tgz", + "integrity": "sha512-5xbvDASjklrmy88O6gmGXgYhpByCXqOj5wIgyvwZe2l83T1bE+iOfGI4pGzZJ/mN+qTn1DNKq8BPBPtDgb7Q2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/url": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@cspell/url/-/url-9.7.0.tgz", + "integrity": "sha512-ZaaBr0pTvNxmyUbIn+nVPXPr383VqJzfUDMWicgTjJIeo2+T2hOq2kNpgpvTIrWtZrsZnSP8oXms1+sKTjcvkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", + "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.1.tgz", + "integrity": "sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/type-utils": "8.57.1", + "@typescript-eslint/utils": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.57.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.1.tgz", + "integrity": "sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.1.tgz", + "integrity": "sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.57.1", + "@typescript-eslint/types": "^8.57.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.1.tgz", + "integrity": "sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.1.tgz", + "integrity": "sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.1.tgz", + "integrity": "sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/utils": "8.57.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.1.tgz", + "integrity": "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.1.tgz", + "integrity": "sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.57.1", + "@typescript-eslint/tsconfig-utils": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.1.tgz", + "integrity": "sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.1.tgz", + "integrity": "sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-timsort": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", + "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", + "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", + "dev": true, + "license": "MPL-2.0", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk-template": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.2.tgz", + "integrity": "sha512-2bxTP2yUH7AJj/VAXfcA+4IcWGdQ87HwBANLt5XxGTeomo8yG0y95N1um9i5StvhT/Bl0/2cARA5v1PpPXUxUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/clear-module": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/clear-module/-/clear-module-4.1.2.tgz", + "integrity": "sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^2.0.0", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/comment-json": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.6.2.tgz", + "integrity": "sha512-R2rze/hDX30uul4NZoIZ76ImSJLFxn/1/ZxtKC1L77y2X1k+yYu1joKbAtMA2Fg3hZrTOiw0I5mwVMo0cf250w==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-timsort": "^1.0.3", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cspell": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-9.7.0.tgz", + "integrity": "sha512-ftxOnkd+scAI7RZ1/ksgBZRr0ouC7QRKtPQhD/PbLTKwAM62sSvRhE1bFsuW3VKBn/GilWzTjkJ40WmnDqH5iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-json-reporter": "9.7.0", + "@cspell/cspell-performance-monitor": "9.7.0", + "@cspell/cspell-pipe": "9.7.0", + "@cspell/cspell-types": "9.7.0", + "@cspell/cspell-worker": "9.7.0", + "@cspell/dynamic-import": "9.7.0", + "@cspell/url": "9.7.0", + "ansi-regex": "^6.2.2", + "chalk": "^5.6.2", + "chalk-template": "^1.1.2", + "commander": "^14.0.3", + "cspell-config-lib": "9.7.0", + "cspell-dictionary": "9.7.0", + "cspell-gitignore": "9.7.0", + "cspell-glob": "9.7.0", + "cspell-io": "9.7.0", + "cspell-lib": "9.7.0", + "fast-json-stable-stringify": "^2.1.0", + "flatted": "^3.3.3", + "semver": "^7.7.4", + "tinyglobby": "^0.2.15" + }, + "bin": { + "cspell": "bin.mjs", + "cspell-esm": "bin.mjs" + }, + "engines": { + "node": ">=20.18" + }, + "funding": { + "url": "https://github.com/streetsidesoftware/cspell?sponsor=1" + } + }, + "node_modules/cspell-config-lib": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-9.7.0.tgz", + "integrity": "sha512-pguh8A3+bSJ1OOrKCiQan8bvaaY125de76OEFz7q1Pq309lIcDrkoL/W4aYbso/NjrXaIw6OjkgPMGRBI/IgGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-types": "9.7.0", + "comment-json": "^4.5.1", + "smol-toml": "^1.6.0", + "yaml": "^2.8.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-dictionary": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-9.7.0.tgz", + "integrity": "sha512-k/Wz0so32+0QEqQe21V9m4BNXM5ZN6lz3Ix/jLCbMxFIPl6wT711ftjOWIEMFhvUOP0TWXsbzcuE9mKtS5mTig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-performance-monitor": "9.7.0", + "@cspell/cspell-pipe": "9.7.0", + "@cspell/cspell-types": "9.7.0", + "cspell-trie-lib": "9.7.0", + "fast-equals": "^6.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-gitignore": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-9.7.0.tgz", + "integrity": "sha512-MtoYuH4ah4K6RrmaF834npMcRsTKw0658mC6yvmBacUQOmwB/olqyuxF3fxtbb55HDb7cXDQ35t1XuwwGEQeZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/url": "9.7.0", + "cspell-glob": "9.7.0", + "cspell-io": "9.7.0" + }, + "bin": { + "cspell-gitignore": "bin.mjs" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-glob": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-9.7.0.tgz", + "integrity": "sha512-LUeAoEsoCJ+7E3TnUmWBscpVQOmdwBejMlFn0JkXy6LQzxrybxXBKf65RSdIv1o5QtrhQIMa358xXYQG0sv/tA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/url": "9.7.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-glob/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/cspell-grammar": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-9.7.0.tgz", + "integrity": "sha512-oEYME+7MJztfVY1C06aGcJgEYyqBS/v/ETkQGPzf/c6ObSAPRcUbVtsXZgnR72Gru9aBckc70xJcD6bELdoWCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-pipe": "9.7.0", + "@cspell/cspell-types": "9.7.0" + }, + "bin": { + "cspell-grammar": "bin.mjs" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-io": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-9.7.0.tgz", + "integrity": "sha512-V7x0JHAUCcJPRCH8c0MQkkaKmZD2yotxVyrNEx2SZTpvnKrYscLEnUUTWnGJIIf9znzISqw116PLnYu2c+zd6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-service-bus": "9.7.0", + "@cspell/url": "9.7.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-lib": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-9.7.0.tgz", + "integrity": "sha512-aTx/aLRpnuY1RJnYAu+A8PXfm1oIUdvAQ4W9E66bTgp1LWI+2G2++UtaPxRIgI0olxE9vcXqUnKpjOpO+5W9bQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-bundled-dicts": "9.7.0", + "@cspell/cspell-performance-monitor": "9.7.0", + "@cspell/cspell-pipe": "9.7.0", + "@cspell/cspell-resolver": "9.7.0", + "@cspell/cspell-types": "9.7.0", + "@cspell/dynamic-import": "9.7.0", + "@cspell/filetypes": "9.7.0", + "@cspell/rpc": "9.7.0", + "@cspell/strong-weak-map": "9.7.0", + "@cspell/url": "9.7.0", + "clear-module": "^4.1.2", + "cspell-config-lib": "9.7.0", + "cspell-dictionary": "9.7.0", + "cspell-glob": "9.7.0", + "cspell-grammar": "9.7.0", + "cspell-io": "9.7.0", + "cspell-trie-lib": "9.7.0", + "env-paths": "^4.0.0", + "gensequence": "^8.0.8", + "import-fresh": "^3.3.1", + "resolve-from": "^5.0.0", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-uri": "^3.1.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-trie-lib": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-9.7.0.tgz", + "integrity": "sha512-a2YqmcraL3g6I/4gY7SYWEZfP73oLluUtxO7wxompk/kOG2K1FUXyQfZXaaR7HxVv10axT1+NrjhOmXpfbI6LA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@cspell/cspell-types": "9.7.0" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "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, + "license": "MIT", + "peer": true + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/env-paths": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-4.0.0.tgz", + "integrity": "sha512-pxP8eL2SwwaTRi/KHYwLYXinDs7gL3jxFcBYmEdYfZmZXbaVDvdppd0XBU8qVz03rDfKZMXg1omHCbsJjZrMsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-safe-filename": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.1.tgz", + "integrity": "sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.1", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", + "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" + }, + "engines": { + "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-hooks": "^4.3.0" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "license": "MIT", + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-airbnb-base/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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz", + "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.1", + "synckit": "^0.11.12" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", + "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/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, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-equals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-6.0.0.tgz", + "integrity": "sha512-PFhhIGgdM79r5Uztdj9Zb6Tt1zKafqVfdMGwVca1z5z6fbX7DmsySSuJd8HiP6I1j505DCS83cLxo5rmSNeVEA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.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, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "license": "MIT", "dependencies": { - "@types/connect": "*", - "@types/node": "*" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@types/cors": { - "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*" + "engines": { + "node": ">= 0.4" } }, - "node_modules/@types/express": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", - "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "node_modules/gensequence": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-8.0.8.tgz", + "integrity": "sha512-omMVniXEXpdx/vKxGnPRoO2394Otlze28TyxECbFVyoSpZ9H3EO7lemjcB12OpQJzRW4e5tt/dL1rOxry6aMHg==", "dev": true, "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "^2" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@types/express-serve-static-core": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", - "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", - "dev": true, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/@types/node": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", - "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "undici-types": "~7.18.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@types/qs": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", - "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, - "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@types/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@types/http-errors": "*", - "@types/node": "*" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "node_modules/global-directory": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-5.0.0.tgz", + "integrity": "sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==", + "dev": true, "license": "MIT", "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" + "ini": "6.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "type-fest": "^0.20.2" }, "engines": { - "node": ">=0.4.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/acorn-walk": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", - "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.11.0" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { - "node": ">=0.4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "license": "MIT" }, - "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, "license": "MIT", "engines": { - "node": "18 || 20 || >=22" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/body-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, "license": "MIT", "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.1", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" + "has-symbols": "^1.0.3" }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", - "dev": true, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { - "balanced-match": "^4.0.2" + "function-bind": "^1.1.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": ">= 0.4" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { - "node": ">=8" + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, "license": "MIT", + "bin": { + "husky": "bin.js" + }, "engines": { - "node": ">= 0.8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, + "license": "ISC" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/import-fresh/node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "callsites": "^3.0.0" }, "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=6" } }, - "node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, "license": "MIT", "engines": { - "node": ">=18" - }, + "node": ">=4" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "dev": true, + "license": "MIT", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=0.8.19" } }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "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==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "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==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, "engines": { - "node": ">= 0.6" + "node": ">= 0.4" } }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", "engines": { - "node": ">=6.6.0" + "node": ">= 0.10" } }, - "node_modules/cors": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", - "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "license": "MIT", "dependencies": { - "object-assign": "^4", - "vary": "^1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": ">= 0.10" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": ">=6.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/diff": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", - "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, "engines": { - "node": ">=0.3.1" + "node": ">=8" } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, "license": "MIT", "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" + "call-bound": "^1.0.3" }, "engines": { - "node": ">= 18" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/finalhandler": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">=0.10.0" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=0.12.0" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", + "call-bound": "^1.0.2", "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -712,37 +4386,76 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "node_modules/is-safe-filename": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-safe-filename/-/is-safe-filename-0.1.1.tgz", + "integrity": "sha512-4SrR7AdnY11LHfDKTZY1u6Ga3RuxZdl3YKWWShO5iyuG5h8QS4GD2tOb04peBJ5I7pXbR+CGBNEhTcwK+FzN3g==", + "dev": true, "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "engines": { + "node": ">=20" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">= 6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, "engines": { "node": ">= 0.4" }, @@ -750,20 +4463,27 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -772,128 +4492,227 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, "license": "MIT", "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.10" + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "binary-extensions": "^2.0.0" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" }, "engines": { - "node": ">=8" + "node": ">=4.0" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0", + "peer": true + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, "license": "MIT", + "peer": true, + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, "engines": { - "node": ">=0.12.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, "license": "MIT" }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -972,12 +4791,29 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, "node_modules/negotiator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", @@ -987,6 +4823,37 @@ "node": ">= 0.6" } }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/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, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/nodemon": { "version": "3.1.14", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.14.tgz", @@ -1033,14 +4900,114 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -1069,6 +5036,87 @@ "wrappy": "1" } }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz", + "integrity": "sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1078,6 +5126,43 @@ "node": ">= 0.8" } }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, "node_modules/path-to-regexp": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", @@ -1101,6 +5186,68 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -1121,6 +5268,16 @@ "dev": true, "license": "MIT" }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/qs": { "version": "6.15.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", @@ -1136,6 +5293,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -1160,33 +5338,223 @@ "node": ">= 0.10" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" + "es-errors": "^1.3.0", + "isarray": "^2.0.5" }, "engines": { - "node": ">=8.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" }, "engines": { - "node": ">= 18" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safer-buffer": { @@ -1253,12 +5621,84 @@ "url": "https://opencollective.com/express" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -1300,11 +5740,267 @@ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/smol-toml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.0.tgz", + "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1312,58 +6008,75 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "node_modules/synckit": { + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", + "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" + "@pkgr/core": "^0.2.9" }, "engines": { - "node": ">= 0.4" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/synckit" } }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { - "semver": "^7.5.3" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { - "node": ">=10" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/to-regex-range": { @@ -1398,6 +6111,19 @@ "nodetouch": "bin/nodetouch.js" } }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", @@ -1442,6 +6168,45 @@ } } }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/type-is": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", @@ -1456,6 +6221,84 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -1470,6 +6313,25 @@ "node": ">=14.17" } }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", @@ -1493,6 +6355,16 @@ "node": ">= 0.8" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -1509,12 +6381,170 @@ "node": ">= 0.8" } }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -1524,6 +6554,19 @@ "engines": { "node": ">=6" } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index 6e7e1bc..60d3f54 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,14 @@ "build": "tsc", "dev": "nodemon src/index.ts", "typecheck": "tsc --pretty --noEmit --skipLibCheck", - "verify": "npm run typecheck" + "verify:prettier": "npx prettier . --check", + "verify:eslint": "npx eslint \"./**/*.{js,jsx,ts,tsx}\" --max-warnings=0", + "verify": "npm run typecheck && npm run verify:prettier && npm run verify:eslint && npm run spellcheck", + "format:eslint": "npx eslint \"./**/*.{js,jsx,ts,tsx}\" --fix", + "format:prettier": "npx prettier --write .", + "format": "npm run format:eslint && npm run format:prettier", + "spellcheck": "cspell \"**/*.{js,ts,jsx,tsx,md,json}\"", + "prepare": "husky" }, "keywords": [], "author": "", @@ -23,6 +30,25 @@ "cors": "^2.8.6", "nodemon": "^3.1.14", "ts-node": "^10.9.2", - "typescript": "^5.9.3" + "typescript": "^5.9.3", + "@typescript-eslint/eslint-plugin": "^8.50.1", + "@typescript-eslint/parser": "^8.50.1", + "cspell": "^9.6.2", + "eslint": "^8.11.0", + "husky": "^9.1.7", + "lint-staged": "^16.2.7", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-prettier": "^5.5.4", + "prettier": "^3.7.4" + }, + "lint-staged": { + "*.{js,jsx,ts,tsx}": [ + "npm run fix:prettier" + ], + "*.{json,md}": [ + "npm run fix:prettier" + ] } } From 5643251f114be574c659f527e2f683c75a2fc87e Mon Sep 17 00:00:00 2001 From: TENSIILE Date: Wed, 18 Mar 2026 15:18:40 +0300 Subject: [PATCH 05/21] chore: adds husky (#3) --- .husky/pre-commit | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .husky/pre-commit diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..73361f0 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,3 @@ +npm run format +npm run verify +npx lint-staged \ No newline at end of file From e11ed04d8e2fdf32c049312457712798ba296f8a Mon Sep 17 00:00:00 2001 From: TENSIILE Date: Wed, 18 Mar 2026 15:49:55 +0300 Subject: [PATCH 06/21] adds a word to the cspell dictionary (#3) --- cspell.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cspell.json b/cspell.json index aa74856..df09e8b 100644 --- a/cspell.json +++ b/cspell.json @@ -1,7 +1,7 @@ { "version": "0.2", "language": "en,ru", - "words": ["Saborter", "saborter", "Laptev", "Vladislav", "tgz", "Сalls"], + "words": ["Saborter", "saborter", "Laptev", "Vladislav", "tgz", "Сalls", "Interruptible"], "flagWords": [], "ignorePaths": [ "node_modules/**", From 5d7fe062f8b50e16dc89480c47e9d5aed0c5ef33 Mon Sep 17 00:00:00 2001 From: TENSIILE Date: Wed, 18 Mar 2026 15:56:29 +0300 Subject: [PATCH 07/21] feat: adds an API for integration with Express (#3) --- package-lock.json | 448 ++++++++++++++++++ package.json | 4 +- src/service/abortable-service.ts | 74 --- src/service/index.ts | 2 +- .../request-interruption-service.constants.ts | 2 + .../request-interruption-service.lib.ts | 47 ++ src/service/request-interruption-service.ts | 74 +++ .../request-interruption-service.types.ts | 11 + .../request-interruption-service.utils.ts | 23 + 9 files changed, 608 insertions(+), 77 deletions(-) delete mode 100644 src/service/abortable-service.ts create mode 100644 src/service/request-interruption-service.constants.ts create mode 100644 src/service/request-interruption-service.lib.ts create mode 100644 src/service/request-interruption-service.ts create mode 100644 src/service/request-interruption-service.types.ts create mode 100644 src/service/request-interruption-service.utils.ts diff --git a/package-lock.json b/package-lock.json index 647c79f..e56a650 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "eslint-plugin-import": "^2.32.0", "eslint-plugin-prettier": "^5.5.4", "husky": "^9.1.7", + "lint-staged": "^16.2.7", "nodemon": "^3.1.14", "prettier": "^3.7.4", "ts-node": "^10.9.2", @@ -1381,6 +1382,22 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", @@ -1885,6 +1902,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", + "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^8.0.0", + "string-width": "^8.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1905,6 +1955,13 @@ "dev": true, "license": "MIT" }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, "node_modules/commander": { "version": "14.0.3", "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", @@ -2428,6 +2485,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/es-abstract": { "version": "1.24.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", @@ -3335,6 +3405,13 @@ "node": ">= 0.6" } }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, "node_modules/express": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", @@ -3628,6 +3705,19 @@ "node": ">=20" } }, + "node_modules/get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -4265,6 +4355,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-generator-function": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", @@ -4676,6 +4782,61 @@ "node": ">= 0.8.0" } }, + "node_modules/lint-staged": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.4.0.tgz", + "integrity": "sha512-lBWt8hujh/Cjysw5GYVmZpFHXDCgZzhrOm8vbcUdobADZNOK/bRshr2kM3DfgrrtR1DQhfupW9gnIXOfiFi+bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^14.0.3", + "listr2": "^9.0.5", + "picomatch": "^4.0.3", + "string-argv": "^0.3.2", + "tinyexec": "^1.0.4", + "yaml": "^2.8.2" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/listr2": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^5.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -4699,6 +4860,72 @@ "dev": true, "license": "MIT" }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -4775,6 +5002,19 @@ "url": "https://opencollective.com/express" } }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "10.2.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", @@ -5036,6 +5276,22 @@ "wrappy": "1" } }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -5434,6 +5690,23 @@ "node": ">=8" } }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -5445,6 +5718,13 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -5771,6 +6051,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/simple-update-notifier": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", @@ -5784,6 +6077,36 @@ "node": ">=10" } }, + "node_modules/slice-ansi": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", + "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.3", + "is-fullwidth-code-point": "^5.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/smol-toml": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.0.tgz", @@ -5820,6 +6143,49 @@ "node": ">= 0.4" } }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", + "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/string.prototype.includes": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", @@ -6031,6 +6397,16 @@ "dev": true, "license": "MIT" }, + "node_modules/tinyexec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", @@ -6510,6 +6886,78 @@ "node": ">=0.10.0" } }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index 60d3f54..af840bc 100644 --- a/package.json +++ b/package.json @@ -45,10 +45,10 @@ }, "lint-staged": { "*.{js,jsx,ts,tsx}": [ - "npm run fix:prettier" + "npm run format:prettier" ], "*.{json,md}": [ - "npm run fix:prettier" + "npm run format:prettier" ] } } diff --git a/src/service/abortable-service.ts b/src/service/abortable-service.ts deleted file mode 100644 index 43f65e7..0000000 --- a/src/service/abortable-service.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { Request, Response, NextFunction } from 'express'; - -type AbortFunction = () => void; - -export const getRequestId = (req: Request): string => { - const requestId = req.headers['x-request-id']?.toString().split(','); - return requestId?.[0] ?? ''; -}; - -export class AbortableService { - private abortRegistries = new Map(); - - private registerAbortableFunction = ( - requestId: string, - abortFn: AbortFunction - ): void => { - this.abortRegistries.set(requestId, abortFn); - }; - - public abort = ( - requestId: string, - { deletable = true }: { deletable?: boolean } = {} - ): boolean => { - const abortFn = this.abortRegistries.get(requestId) ?? null; - - if (abortFn) { - abortFn(); - - if (deletable) { - this.abortRegistries.delete(requestId); - } - - return true; - } - - return false; - }; - - public expressMiddleware = ( - req: Request, - res: Response, - next: NextFunction - ) => { - const requestId = getRequestId(req); - - console.log('MIDDLEWARE', this.abortRegistries); - - if (!requestId) { - return next(); - } - - if (this.abortRegistries.has(requestId)) { - this.abort(requestId, { deletable: false }); - } - - const controller = new AbortController(); - - (req as any).controller = controller; - (req as any).signal = controller.signal; - - this.registerAbortableFunction(requestId, () => { - controller.abort(new Error('AbortError')); - }); - - req.on('close', () => { - if (!res.writableEnded) { - console.log('requestId', requestId); - this.abort(requestId); - } - }); - - next(); - }; -} diff --git a/src/service/index.ts b/src/service/index.ts index fd5b13c..ca773aa 100644 --- a/src/service/index.ts +++ b/src/service/index.ts @@ -1 +1 @@ -export * from './abortable-service'; +export * from './request-interruption-service'; diff --git a/src/service/request-interruption-service.constants.ts b/src/service/request-interruption-service.constants.ts new file mode 100644 index 0000000..5c2923d --- /dev/null +++ b/src/service/request-interruption-service.constants.ts @@ -0,0 +1,2 @@ +export const abortableMetaSymbol = Symbol('Saborter.meta'); +export const X_REQUEST_ID_HEADER = 'x-request-id'; diff --git a/src/service/request-interruption-service.lib.ts b/src/service/request-interruption-service.lib.ts new file mode 100644 index 0000000..fd4775a --- /dev/null +++ b/src/service/request-interruption-service.lib.ts @@ -0,0 +1,47 @@ +import { Request, Response } from 'express'; +import { getRequestMeta } from './request-interruption-service.utils'; +import { WithAbortableConfig } from './request-interruption-service.types'; + +export const getAbortSignal = (req: Request): AbortSignal | null => { + return getRequestMeta(req).signal ?? null; +}; + +export const withAbortable = ( + handler: (req: Request, res: Response) => Promise, + { isErrorNativeBehavior = false }: WithAbortableConfig = {} +) => { + return async (req: Request, res: Response) => { + const signal = getAbortSignal(req); + + if (!signal) return handler(req, res); + + let currentReject: ((reason?: any) => void) | null = null; + + const listener = () => currentReject?.(signal.reason); + + try { + await Promise.race([ + handler(req, res), + new Promise((_, reject) => { + currentReject = reject; + + signal.addEventListener('abort', listener, { + once: true + }); + }) + ]); + } catch (err) { + if (isErrorNativeBehavior) { + throw err; + } + } finally { + signal.removeEventListener('abort', listener); + } + }; +}; + +export const abort = (req: Request, reason?: any): void => { + const controller = getRequestMeta(req).controller ?? new AbortController(); + + controller.abort(reason); +}; diff --git a/src/service/request-interruption-service.ts b/src/service/request-interruption-service.ts new file mode 100644 index 0000000..262fd54 --- /dev/null +++ b/src/service/request-interruption-service.ts @@ -0,0 +1,74 @@ +import { Request, Response, NextFunction, Express } from 'express'; +import { AbortFunction } from './request-interruption-service.types'; +import { getRequestId, setRequestMeta } from './request-interruption-service.utils'; + +class RequestInterruptionService { + private abortRegistries = new Map(); + + private registerAbortableFunction = (requestId: string, abortFn: AbortFunction): void => { + this.abortRegistries.set(requestId, abortFn); + }; + + public abort = (requestId: string, { deletable = true }: { deletable?: boolean } = {}): boolean => { + const abortFn = this.abortRegistries.get(requestId) ?? null; + + if (abortFn) { + abortFn(); + + if (deletable) { + this.abortRegistries.delete(requestId); + } + + return true; + } + + return false; + }; + + public expressMiddleware = (req: Request, res: Response, next: NextFunction): void => { + const requestId = getRequestId(req); + + if (!requestId) { + return next(); + } + + if (this.abortRegistries.has(requestId)) { + this.abort(requestId, { deletable: false }); + } + + const controller = new AbortController(); + + setRequestMeta(req, controller); + + this.registerAbortableFunction(requestId, () => { + controller.abort(new Error('AbortError')); + }); + + req.on('close', () => { + if (!res.writableEnded) { + this.abort(requestId); + } + }); + + next(); + }; +} + +export const initRequestInterruptionService = ( + app: Express, + { basePath = '', endpointName = '/api/cancel' }: { basePath?: string; endpointName?: string } = {} +) => { + const requestInterruptionService = new RequestInterruptionService(); + + app.use(requestInterruptionService.expressMiddleware); + + app.post(`${basePath}${endpointName}`, (req, res) => { + const requestId = getRequestId(req); + + if (requestId && requestInterruptionService.abort(requestId)) { + res.status(499).json({ cancelled: true }); + } else { + res.status(404).json({ error: 'Request not found' }); + } + }); +}; diff --git a/src/service/request-interruption-service.types.ts b/src/service/request-interruption-service.types.ts new file mode 100644 index 0000000..12041c6 --- /dev/null +++ b/src/service/request-interruption-service.types.ts @@ -0,0 +1,11 @@ +export type AbortFunction = () => void; + +export interface InterruptibleRequestMeta { + requestId: string; + controller: AbortController; + signal: AbortSignal; +} + +export interface WithAbortableConfig { + isErrorNativeBehavior?: boolean; +} diff --git a/src/service/request-interruption-service.utils.ts b/src/service/request-interruption-service.utils.ts new file mode 100644 index 0000000..ba04c31 --- /dev/null +++ b/src/service/request-interruption-service.utils.ts @@ -0,0 +1,23 @@ +import { Request } from 'express'; +import { InterruptibleRequestMeta } from './request-interruption-service.types'; +import * as Constants from './request-interruption-service.constants'; + +export const getRequestId = (req: Request): string => { + const requestId = req.headers[Constants.X_REQUEST_ID_HEADER]?.toString().split(','); + + return requestId?.[0] ?? ''; +}; + +export const getRequestMeta = (req: Request): InterruptibleRequestMeta => { + return (req as any)[Constants.abortableMetaSymbol]; +}; + +export const setRequestMeta = (req: Request, controller: AbortController): void => { + const requestId = getRequestId(req); + + (req as any)[Constants.abortableMetaSymbol] = { + requestId, + controller, + signal: controller.signal + } as InterruptibleRequestMeta; +}; From 3a1c867b3b6df0be67e1b075ce05813cad5f3a3d Mon Sep 17 00:00:00 2001 From: TENSIILE Date: Wed, 18 Mar 2026 16:30:42 +0300 Subject: [PATCH 08/21] fix: corrects the branch name for CI (#5) --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 70c6dff..ff0be5a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,12 +3,12 @@ name: CI on: pull_request: branches: - - main + - master - develop - 'release/v*.*.*' push: branches: - - main + - master - develop - 'release/v*.*.*' From e7feee596c355fdd0812563920e7e9eddd3e6ddc Mon Sep 17 00:00:00 2001 From: TENSIILE Date: Wed, 18 Mar 2026 16:31:36 +0300 Subject: [PATCH 09/21] changes the hook to a pre-push (#5) --- .husky/{pre-commit => pre-push} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .husky/{pre-commit => pre-push} (100%) diff --git a/.husky/pre-commit b/.husky/pre-push similarity index 100% rename from .husky/pre-commit rename to .husky/pre-push From 90def8f986367bf16a4f5486ce09353296b3ec22 Mon Sep 17 00:00:00 2001 From: TENSIILE Date: Wed, 18 Mar 2026 16:32:29 +0300 Subject: [PATCH 10/21] feat: adds a demo that runs in development mode (#5) --- demo/index.ts | 0 package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 demo/index.ts diff --git a/demo/index.ts b/demo/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/package.json b/package.json index af840bc..8c1419f 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "start": "node dist/index.js", "build": "tsc", - "dev": "nodemon src/index.ts", + "dev": "nodemon demo/index.ts", "typecheck": "tsc --pretty --noEmit --skipLibCheck", "verify:prettier": "npx prettier . --check", "verify:eslint": "npx eslint \"./**/*.{js,jsx,ts,tsx}\" --max-warnings=0", From 1f8facd802b4eb92a7c246ccbcd2cec66c7bf742 Mon Sep 17 00:00:00 2001 From: TENSIILE Date: Thu, 19 Mar 2026 18:52:42 +0300 Subject: [PATCH 11/21] updates logo (#5) --- assets/logo.png | Bin 83134 -> 83186 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/logo.png b/assets/logo.png index 8f262f29a62a07d68a241e4065a693301a6f9362..80d21b9efe292efceaf49f7ee962c29a2231befc 100644 GIT binary patch literal 83186 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 literal 83134 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 Date: Thu, 19 Mar 2026 18:53:19 +0300 Subject: [PATCH 12/21] chore: adds import/no-unresolved setting (#5) --- .eslintrc | 95 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 48 insertions(+), 47 deletions(-) diff --git a/.eslintrc b/.eslintrc index 2d87807..19cda9e 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,51 +1,52 @@ { - "root": true, - "env": { "browser": true, "es2020": true, "jest": true }, - "extends": ["eslint:recommended", "airbnb", "plugin:import/typescript", "plugin:prettier/recommended"], - "parser": "@typescript-eslint/parser", - "ignorePatterns": [ - "**/dist/", - "**/node_modules/", - "**/*.json", - "**/*.html", - "/**/coverage/", - "**/integrations/**/", - "./vite.config.js" - ], - "plugins": ["@typescript-eslint", "prettier"], - "rules": { - "no-continue": "off", - "quotes": "off", - "import/prefer-default-export": ["off"], - "class-methods-use-this": ["off"], - "func-names": ["off"], - "no-plusplus": ["off"], - "prefer-spread": ["off"], - "consistent-return": ["off"], - "newline-before-return": "warn", - "default-case": ["off"], - "comma-dangle": ["off"], - "import/extensions": ["off"], - "max-len": ["off"], - "no-console": ["warn", { "allow": ["warn", "error"] }], - "@typescript-eslint/lines-between-class-members": ["off", {}], - "import/no-extraneous-dependencies": ["off"], - "@typescript-eslint/no-unused-vars": ["off", {}], - "no-unused-vars": ["off"], - "prettier/prettier": [ - "error", - { - "arrowParens": "always", - "endOfLine": "auto" - } - ] - }, - "overrides": [ + "root": true, + "env": { "browser": true, "es2020": true, "jest": true }, + "extends": ["eslint:recommended", "airbnb", "plugin:import/typescript", "plugin:prettier/recommended"], + "parser": "@typescript-eslint/parser", + "ignorePatterns": [ + "**/dist/", + "**/node_modules/", + "**/*.json", + "**/*.html", + "/**/coverage/", + "**/integrations/**/", + "./vite.config.js" + ], + "plugins": ["@typescript-eslint", "prettier"], + "rules": { + "no-continue": "off", + "quotes": "off", + "import/prefer-default-export": ["off"], + "class-methods-use-this": ["off"], + "func-names": ["off"], + "no-plusplus": ["off"], + "prefer-spread": ["off"], + "consistent-return": ["off"], + "newline-before-return": "warn", + "default-case": ["off"], + "comma-dangle": ["off"], + "import/extensions": ["off"], + "max-len": ["off"], + "no-console": ["warn", { "allow": ["warn", "error"] }], + "@typescript-eslint/lines-between-class-members": ["off", {}], + "import/no-extraneous-dependencies": ["off"], + "@typescript-eslint/no-unused-vars": ["off", {}], + "no-unused-vars": ["off"], + "import/no-unresolved": "off", + "prettier/prettier": [ + "error", { - "files": ["*.ts", "*.tsx"], - "rules": { - "no-undef": "off" - } + "arrowParens": "always", + "endOfLine": "auto" } ] - } \ No newline at end of file + }, + "overrides": [ + { + "files": ["*.ts", "*.tsx"], + "rules": { + "no-undef": "off" + } + } + ] +} From 7b1f45a4ee5a75f669bc997eb3a72c85581faf53 Mon Sep 17 00:00:00 2001 From: TENSIILE Date: Thu, 19 Mar 2026 19:06:19 +0300 Subject: [PATCH 13/21] feat: improves the API for working with saborter.server (#5) --- .../request-interruption-service.constants.ts | 1 - .../request-interruption-service.lib.ts | 47 ------------------- src/service/request-interruption-service.ts | 15 ++++-- .../request-interruption-service.utils.ts | 15 +----- 4 files changed, 13 insertions(+), 65 deletions(-) delete mode 100644 src/service/request-interruption-service.lib.ts diff --git a/src/service/request-interruption-service.constants.ts b/src/service/request-interruption-service.constants.ts index 5c2923d..fa9f70a 100644 --- a/src/service/request-interruption-service.constants.ts +++ b/src/service/request-interruption-service.constants.ts @@ -1,2 +1 @@ -export const abortableMetaSymbol = Symbol('Saborter.meta'); export const X_REQUEST_ID_HEADER = 'x-request-id'; diff --git a/src/service/request-interruption-service.lib.ts b/src/service/request-interruption-service.lib.ts deleted file mode 100644 index fd4775a..0000000 --- a/src/service/request-interruption-service.lib.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Request, Response } from 'express'; -import { getRequestMeta } from './request-interruption-service.utils'; -import { WithAbortableConfig } from './request-interruption-service.types'; - -export const getAbortSignal = (req: Request): AbortSignal | null => { - return getRequestMeta(req).signal ?? null; -}; - -export const withAbortable = ( - handler: (req: Request, res: Response) => Promise, - { isErrorNativeBehavior = false }: WithAbortableConfig = {} -) => { - return async (req: Request, res: Response) => { - const signal = getAbortSignal(req); - - if (!signal) return handler(req, res); - - let currentReject: ((reason?: any) => void) | null = null; - - const listener = () => currentReject?.(signal.reason); - - try { - await Promise.race([ - handler(req, res), - new Promise((_, reject) => { - currentReject = reject; - - signal.addEventListener('abort', listener, { - once: true - }); - }) - ]); - } catch (err) { - if (isErrorNativeBehavior) { - throw err; - } - } finally { - signal.removeEventListener('abort', listener); - } - }; -}; - -export const abort = (req: Request, reason?: any): void => { - const controller = getRequestMeta(req).controller ?? new AbortController(); - - controller.abort(reason); -}; diff --git a/src/service/request-interruption-service.ts b/src/service/request-interruption-service.ts index 262fd54..f76d398 100644 --- a/src/service/request-interruption-service.ts +++ b/src/service/request-interruption-service.ts @@ -1,6 +1,7 @@ import { Request, Response, NextFunction, Express } from 'express'; +import { AbortError } from 'saborter/errors'; import { AbortFunction } from './request-interruption-service.types'; -import { getRequestId, setRequestMeta } from './request-interruption-service.utils'; +import { getRequestId, setExpressMetadata } from './request-interruption-service.utils'; class RequestInterruptionService { private abortRegistries = new Map(); @@ -38,10 +39,10 @@ class RequestInterruptionService { const controller = new AbortController(); - setRequestMeta(req, controller); + setExpressMetadata(req, controller); this.registerAbortableFunction(requestId, () => { - controller.abort(new Error('AbortError')); + controller.abort(new AbortError('The endpoint was interrupted', { initiator: 'server' })); }); req.on('close', () => { @@ -50,6 +51,12 @@ class RequestInterruptionService { } }); + res.on('finish', () => { + if (!controller.signal.aborted) { + this.abortRegistries.delete(requestId); + } + }); + next(); }; } @@ -66,7 +73,7 @@ export const initRequestInterruptionService = ( const requestId = getRequestId(req); if (requestId && requestInterruptionService.abort(requestId)) { - res.status(499).json({ cancelled: true }); + res.status(200).json({ aborted: true }); } else { res.status(404).json({ error: 'Request not found' }); } diff --git a/src/service/request-interruption-service.utils.ts b/src/service/request-interruption-service.utils.ts index ba04c31..d79e579 100644 --- a/src/service/request-interruption-service.utils.ts +++ b/src/service/request-interruption-service.utils.ts @@ -1,5 +1,4 @@ import { Request } from 'express'; -import { InterruptibleRequestMeta } from './request-interruption-service.types'; import * as Constants from './request-interruption-service.constants'; export const getRequestId = (req: Request): string => { @@ -8,16 +7,6 @@ export const getRequestId = (req: Request): string => { return requestId?.[0] ?? ''; }; -export const getRequestMeta = (req: Request): InterruptibleRequestMeta => { - return (req as any)[Constants.abortableMetaSymbol]; -}; - -export const setRequestMeta = (req: Request, controller: AbortController): void => { - const requestId = getRequestId(req); - - (req as any)[Constants.abortableMetaSymbol] = { - requestId, - controller, - signal: controller.signal - } as InterruptibleRequestMeta; +export const setExpressMetadata = (req: Request, controller: AbortController): void => { + (req as any).signal = controller.signal; }; From 2494ef73be82d6c3506ffbfddb8217ff1e984205 Mon Sep 17 00:00:00 2001 From: TENSIILE Date: Thu, 19 Mar 2026 19:06:55 +0300 Subject: [PATCH 14/21] chore: adds typing to process.env (#5) --- src/global.d.ts | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/global.d.ts diff --git a/src/global.d.ts b/src/global.d.ts new file mode 100644 index 0000000..1e9a3fd --- /dev/null +++ b/src/global.d.ts @@ -0,0 +1,5 @@ +declare namespace NodeJS { + interface ProcessEnv { + PORT?: string; + } +} From 1bb36b306322af87325100983161da31e2d5a498 Mon Sep 17 00:00:00 2001 From: TENSIILE Date: Thu, 19 Mar 2026 19:08:14 +0300 Subject: [PATCH 15/21] installs a saborter package (#5) --- package-lock.json | 9 ++++++++- package.json | 3 ++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index e56a650..fcf2446 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,8 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "express": "^5.2.1" + "express": "^5.2.1", + "saborter": "^2.1.0" }, "devDependencies": { "@types/cors": "^2.8.19", @@ -5782,6 +5783,12 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/saborter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/saborter/-/saborter-2.1.0.tgz", + "integrity": "sha512-fa4jKMskpkGGYInvdRI6xYRmJY4TUIlbbGvKuRzrUjVISgnuBDhmLQfsjVu2ZTnPD6RF7hrRlu8ydLBn6g1ybw==", + "license": "MIT" + }, "node_modules/safe-array-concat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", diff --git a/package.json b/package.json index 8c1419f..53ddf98 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,8 @@ "license": "ISC", "description": "", "dependencies": { - "express": "^5.2.1" + "express": "^5.2.1", + "saborter": "^2.1.0" }, "devDependencies": { "@types/cors": "^2.8.19", From 37f7828bbf36c39d66eb1dec72459ebd458c4b70 Mon Sep 17 00:00:00 2001 From: TENSIILE Date: Thu, 19 Mar 2026 19:09:27 +0300 Subject: [PATCH 16/21] feat: extends the Express query interface (#5) --- src/service/index.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/service/index.ts b/src/service/index.ts index ca773aa..a0831f6 100644 --- a/src/service/index.ts +++ b/src/service/index.ts @@ -1 +1,9 @@ export * from './request-interruption-service'; + +declare global { + namespace Express { + interface Request { + signal: AbortSignal; + } + } +} From fe39d9552d2b7d7eb674f2aa3365a1c29f9cec8f Mon Sep 17 00:00:00 2001 From: TENSIILE Date: Thu, 19 Mar 2026 19:10:17 +0300 Subject: [PATCH 17/21] feat: adds a demo server for testing (#5) --- README.md | 2 +- demo/index.ts | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/index.ts | 1 + 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a9ec0ff..823a137 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@

-**Saborter Server** – A lightweight [Node.js](https://nodejs.org/en) library that automatically cancels server-side operations when the client aborts a request. Built on the standard [AbortController API](https://developer.mozilla.org/en-US/docs/Web/API/AbortController), it seamlessly with [Express](https://expressjs.com/) framework and allows you to stop unnecessary database queries, file writes, or external API calls, saving server resources and improving scalability. Fully tree‑shakeable – only the code you actually use ends up in your bundle. +**Saborter Server** a lightweight [Node.js](https://nodejs.org/en) library that automatically cancels server-side operations when the client aborts a request. Built on the standard [AbortController API](https://developer.mozilla.org/en-US/docs/Web/API/AbortController), it seamlessly with [Express](https://expressjs.com/) framework and allows you to stop unnecessary database queries, file writes, or external API calls, saving server resources and improving scalability. Fully tree‑shakeable – only the code you actually use ends up in your bundle. ## 📚 Documentation diff --git a/demo/index.ts b/demo/index.ts index e69de29..a8e69ef 100644 --- a/demo/index.ts +++ b/demo/index.ts @@ -0,0 +1,58 @@ +import express from 'express'; +import cors from 'cors'; +import { isAbortError } from 'saborter/lib'; +import { initRequestInterruptionService } from '../src'; + +const app = express(); +// eslint-disable-next-line dot-notation +const port = process.env['PORT'] || 3000; + +initRequestInterruptionService(app); + +app.use(cors()); +app.use(express.json()); + +const longRunningOperation = async (signal?: AbortSignal | null) => { + return new Promise((resolve, reject) => { + // eslint-disable-next-line no-console + console.log('Work...'); + const timeout = setTimeout(() => { + // reject(new Error('!!!')); + + // eslint-disable-next-line no-console + console.log('Done!'); + resolve({ done: true }); + }, 10_000); + + signal?.addEventListener( + 'abort', + () => { + clearTimeout(timeout); + const error = new Error('Operation cancelled'); + error.name = 'AbortError'; + + reject(error); + }, + { once: true } + ); + }); +}; + +app.get('/', async (req, res) => { + try { + const result = await longRunningOperation(req.signal); + + res.json(result); + } catch (error) { + if (isAbortError(error)) { + return res.status(499); + } + + res.status(500).send(); + } +}); + +app.listen(port, () => { + // eslint-disable-next-line no-console + console.log(`Server running at http://localhost:${port}`); +}); diff --git a/src/index.ts b/src/index.ts index e69de29..f78beab 100644 --- a/src/index.ts +++ b/src/index.ts @@ -0,0 +1 @@ +export * from './service'; From ff2f2a10f93e26334202f87c2e43a99d21ba838a Mon Sep 17 00:00:00 2001 From: TENSIILE Date: Tue, 24 Mar 2026 22:50:04 +0300 Subject: [PATCH 18/21] refactor: removes the old version of the code (#6) --- src/index.ts | 1 - src/service/index.ts | 9 --- .../request-interruption-service.constants.ts | 1 - src/service/request-interruption-service.ts | 81 ------------------- .../request-interruption-service.types.ts | 11 --- .../request-interruption-service.utils.ts | 12 --- 6 files changed, 115 deletions(-) delete mode 100644 src/index.ts delete mode 100644 src/service/index.ts delete mode 100644 src/service/request-interruption-service.constants.ts delete mode 100644 src/service/request-interruption-service.ts delete mode 100644 src/service/request-interruption-service.types.ts delete mode 100644 src/service/request-interruption-service.utils.ts diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index f78beab..0000000 --- a/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './service'; diff --git a/src/service/index.ts b/src/service/index.ts deleted file mode 100644 index a0831f6..0000000 --- a/src/service/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * from './request-interruption-service'; - -declare global { - namespace Express { - interface Request { - signal: AbortSignal; - } - } -} diff --git a/src/service/request-interruption-service.constants.ts b/src/service/request-interruption-service.constants.ts deleted file mode 100644 index fa9f70a..0000000 --- a/src/service/request-interruption-service.constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const X_REQUEST_ID_HEADER = 'x-request-id'; diff --git a/src/service/request-interruption-service.ts b/src/service/request-interruption-service.ts deleted file mode 100644 index f76d398..0000000 --- a/src/service/request-interruption-service.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { Request, Response, NextFunction, Express } from 'express'; -import { AbortError } from 'saborter/errors'; -import { AbortFunction } from './request-interruption-service.types'; -import { getRequestId, setExpressMetadata } from './request-interruption-service.utils'; - -class RequestInterruptionService { - private abortRegistries = new Map(); - - private registerAbortableFunction = (requestId: string, abortFn: AbortFunction): void => { - this.abortRegistries.set(requestId, abortFn); - }; - - public abort = (requestId: string, { deletable = true }: { deletable?: boolean } = {}): boolean => { - const abortFn = this.abortRegistries.get(requestId) ?? null; - - if (abortFn) { - abortFn(); - - if (deletable) { - this.abortRegistries.delete(requestId); - } - - return true; - } - - return false; - }; - - public expressMiddleware = (req: Request, res: Response, next: NextFunction): void => { - const requestId = getRequestId(req); - - if (!requestId) { - return next(); - } - - if (this.abortRegistries.has(requestId)) { - this.abort(requestId, { deletable: false }); - } - - const controller = new AbortController(); - - setExpressMetadata(req, controller); - - this.registerAbortableFunction(requestId, () => { - controller.abort(new AbortError('The endpoint was interrupted', { initiator: 'server' })); - }); - - req.on('close', () => { - if (!res.writableEnded) { - this.abort(requestId); - } - }); - - res.on('finish', () => { - if (!controller.signal.aborted) { - this.abortRegistries.delete(requestId); - } - }); - - next(); - }; -} - -export const initRequestInterruptionService = ( - app: Express, - { basePath = '', endpointName = '/api/cancel' }: { basePath?: string; endpointName?: string } = {} -) => { - const requestInterruptionService = new RequestInterruptionService(); - - app.use(requestInterruptionService.expressMiddleware); - - app.post(`${basePath}${endpointName}`, (req, res) => { - const requestId = getRequestId(req); - - if (requestId && requestInterruptionService.abort(requestId)) { - res.status(200).json({ aborted: true }); - } else { - res.status(404).json({ error: 'Request not found' }); - } - }); -}; diff --git a/src/service/request-interruption-service.types.ts b/src/service/request-interruption-service.types.ts deleted file mode 100644 index 12041c6..0000000 --- a/src/service/request-interruption-service.types.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type AbortFunction = () => void; - -export interface InterruptibleRequestMeta { - requestId: string; - controller: AbortController; - signal: AbortSignal; -} - -export interface WithAbortableConfig { - isErrorNativeBehavior?: boolean; -} diff --git a/src/service/request-interruption-service.utils.ts b/src/service/request-interruption-service.utils.ts deleted file mode 100644 index d79e579..0000000 --- a/src/service/request-interruption-service.utils.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Request } from 'express'; -import * as Constants from './request-interruption-service.constants'; - -export const getRequestId = (req: Request): string => { - const requestId = req.headers[Constants.X_REQUEST_ID_HEADER]?.toString().split(','); - - return requestId?.[0] ?? ''; -}; - -export const setExpressMetadata = (req: Request, controller: AbortController): void => { - (req as any).signal = controller.signal; -}; From 99dbdc4287b0493a8ef9ff685523281ba5ae1c83 Mon Sep 17 00:00:00 2001 From: TENSIILE Date: Tue, 24 Mar 2026 22:51:22 +0300 Subject: [PATCH 19/21] feat: adds a utility for obtaining request ID (#6) --- src/shared/index.ts | 1 + .../utils/get-request-id/get-request-id.constants.ts | 1 + src/shared/utils/get-request-id/get-request-id.util.ts | 7 +++++++ src/shared/utils/get-request-id/index.ts | 1 + src/shared/utils/index.ts | 1 + 5 files changed, 11 insertions(+) create mode 100644 src/shared/index.ts create mode 100644 src/shared/utils/get-request-id/get-request-id.constants.ts create mode 100644 src/shared/utils/get-request-id/get-request-id.util.ts create mode 100644 src/shared/utils/get-request-id/index.ts create mode 100644 src/shared/utils/index.ts diff --git a/src/shared/index.ts b/src/shared/index.ts new file mode 100644 index 0000000..5322673 --- /dev/null +++ b/src/shared/index.ts @@ -0,0 +1 @@ +export * as Utils from './utils'; diff --git a/src/shared/utils/get-request-id/get-request-id.constants.ts b/src/shared/utils/get-request-id/get-request-id.constants.ts new file mode 100644 index 0000000..fa9f70a --- /dev/null +++ b/src/shared/utils/get-request-id/get-request-id.constants.ts @@ -0,0 +1 @@ +export const X_REQUEST_ID_HEADER = 'x-request-id'; diff --git a/src/shared/utils/get-request-id/get-request-id.util.ts b/src/shared/utils/get-request-id/get-request-id.util.ts new file mode 100644 index 0000000..f86f9f4 --- /dev/null +++ b/src/shared/utils/get-request-id/get-request-id.util.ts @@ -0,0 +1,7 @@ +import * as Constants from './get-request-id.constants'; + +export const getRequestId = (req: T): string => { + const requestId = req.headers[Constants.X_REQUEST_ID_HEADER]?.toString().split(','); + + return requestId?.[0] ?? ''; +}; diff --git a/src/shared/utils/get-request-id/index.ts b/src/shared/utils/get-request-id/index.ts new file mode 100644 index 0000000..9041ab3 --- /dev/null +++ b/src/shared/utils/get-request-id/index.ts @@ -0,0 +1 @@ +export * from './get-request-id.util'; diff --git a/src/shared/utils/index.ts b/src/shared/utils/index.ts new file mode 100644 index 0000000..52d3d3c --- /dev/null +++ b/src/shared/utils/index.ts @@ -0,0 +1 @@ +export * from './get-request-id'; From c1de2cda0221b17738543900ca7db203e0dba6ad Mon Sep 17 00:00:00 2001 From: TENSIILE Date: Tue, 24 Mar 2026 22:52:33 +0300 Subject: [PATCH 20/21] chore: adds a dot-notation rule (#6) --- .eslintrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.eslintrc b/.eslintrc index 19cda9e..d957ec5 100644 --- a/.eslintrc +++ b/.eslintrc @@ -33,6 +33,7 @@ "@typescript-eslint/no-unused-vars": ["off", {}], "no-unused-vars": ["off"], "import/no-unresolved": "off", + "dot-notation": "off", "prettier/prettier": [ "error", { From dc0fdb282a3c48f5d3a81e41f5c561b05071bb59 Mon Sep 17 00:00:00 2001 From: TENSIILE Date: Tue, 24 Mar 2026 22:55:14 +0300 Subject: [PATCH 21/21] feat: adds request cancellation implementation for Express (#6) --- demo/index.ts | 11 +-- src/express.ts | 1 + .../frameworks/express/express.service.ts | 92 +++++++++++++++++++ .../frameworks/express/express.utils.ts | 5 + src/packages/frameworks/express/index.ts | 9 ++ src/packages/frameworks/index.ts | 1 + src/packages/index.ts | 1 + 7 files changed, 113 insertions(+), 7 deletions(-) create mode 100644 src/express.ts create mode 100644 src/packages/frameworks/express/express.service.ts create mode 100644 src/packages/frameworks/express/express.utils.ts create mode 100644 src/packages/frameworks/express/index.ts create mode 100644 src/packages/frameworks/index.ts diff --git a/demo/index.ts b/demo/index.ts index a8e69ef..7486128 100644 --- a/demo/index.ts +++ b/demo/index.ts @@ -1,13 +1,12 @@ import express from 'express'; import cors from 'cors'; import { isAbortError } from 'saborter/lib'; -import { initRequestInterruptionService } from '../src'; +import { initRequestInterrupts } from '../src/express'; const app = express(); -// eslint-disable-next-line dot-notation const port = process.env['PORT'] || 3000; -initRequestInterruptionService(app); +initRequestInterrupts(app, { endpointName: '/api/abort' }); app.use(cors()); app.use(express.json()); @@ -17,12 +16,10 @@ const longRunningOperation = async (signal?: AbortSignal | null) => { // eslint-disable-next-line no-console console.log('Work...'); const timeout = setTimeout(() => { - // reject(new Error('!!!')); - // eslint-disable-next-line no-console console.log('Done!'); resolve({ done: true }); - }, 10_000); + }, 30_000); signal?.addEventListener( 'abort', @@ -45,7 +42,7 @@ app.get('/', async (req, res) => { res.json(result); } catch (error) { if (isAbortError(error)) { - return res.status(499); + return res.status(499).send(); } res.status(500).send(); diff --git a/src/express.ts b/src/express.ts new file mode 100644 index 0000000..4331ce9 --- /dev/null +++ b/src/express.ts @@ -0,0 +1 @@ +export * from './packages/frameworks/express'; diff --git a/src/packages/frameworks/express/express.service.ts b/src/packages/frameworks/express/express.service.ts new file mode 100644 index 0000000..bfa2f7c --- /dev/null +++ b/src/packages/frameworks/express/express.service.ts @@ -0,0 +1,92 @@ +import { Request, Response, NextFunction, Express } from 'express'; +import { AbortError } from 'saborter/errors'; +import { setSignalInExpressRequest } from './express.utils'; +import * as Shared from '../../../shared'; + +type AbortFunction = () => void; + +class ExpressRequestInterruptionService { + private abortRegistries = new Map(); + + private registerAbortableFunction = (requestId: string, abortFn: AbortFunction): void => { + this.abortRegistries.set(requestId, abortFn); + }; + + public abort = (requestId: string, { deletable = true }: { deletable?: boolean } = {}): boolean => { + const abortFn = this.abortRegistries.get(requestId) ?? null; + + if (abortFn) { + abortFn(); + + if (deletable) { + this.abortRegistries.delete(requestId); + } + + return true; + } + + return false; + }; + + public expressMiddleware = (req: Request, res: Response, next: NextFunction): void => { + const requestId = Shared.Utils.getRequestId(req); + + if (!requestId) { + return next(); + } + + if (this.abortRegistries.has(requestId)) { + this.abort(requestId, { deletable: false }); + } + + const controller = new AbortController(); + + setSignalInExpressRequest(req, controller); + + this.registerAbortableFunction(requestId, () => { + controller.abort(new AbortError('The endpoint was interrupted', { initiator: 'server' })); + }); + + req.on('close', () => { + if (!res.headersSent && !res.writableEnded) { + this.abort(requestId); + } + }); + + res.on('finish', () => { + if (!controller.signal.aborted) { + this.abortRegistries.delete(requestId); + } + }); + + next(); + }; +} + +export const initRequestInterrupts = ( + app: Express, + { endpointName = '/api/cancel' }: { endpointName?: string } = {} +) => { + const requestInterruptionService = new ExpressRequestInterruptionService(); + + app.use(requestInterruptionService.expressMiddleware); + + app.post(`${endpointName}`, async (req, res) => { + const requestId = await new Promise((resolve) => { + let rawBody = ''; + + req.on('data', (chunk) => { + rawBody += chunk; + }); + req.on('end', () => { + resolve(rawBody); + }); + }); + + if (requestId && requestInterruptionService.abort(requestId)) { + res.status(200).json({ aborted: true }); + } else { + res.status(404).json({ error: 'Request not found' }); + } + }); +}; diff --git a/src/packages/frameworks/express/express.utils.ts b/src/packages/frameworks/express/express.utils.ts new file mode 100644 index 0000000..282dce1 --- /dev/null +++ b/src/packages/frameworks/express/express.utils.ts @@ -0,0 +1,5 @@ +import { Request } from 'express'; + +export const setSignalInExpressRequest = (req: Request, controller: AbortController): void => { + (req as any).signal = controller.signal; +}; diff --git a/src/packages/frameworks/express/index.ts b/src/packages/frameworks/express/index.ts new file mode 100644 index 0000000..dd9a028 --- /dev/null +++ b/src/packages/frameworks/express/index.ts @@ -0,0 +1,9 @@ +export * from './express.service'; + +declare global { + namespace Express { + interface Request { + signal: AbortSignal; + } + } +} diff --git a/src/packages/frameworks/index.ts b/src/packages/frameworks/index.ts new file mode 100644 index 0000000..30bdee8 --- /dev/null +++ b/src/packages/frameworks/index.ts @@ -0,0 +1 @@ +export * from './express'; diff --git a/src/packages/index.ts b/src/packages/index.ts index e69de29..556996c 100644 --- a/src/packages/index.ts +++ b/src/packages/index.ts @@ -0,0 +1 @@ +export * from './frameworks';