From 27dd64dc4839d5c0b611ef7406246b5b639337d4 Mon Sep 17 00:00:00 2001 From: Reinaldy Rafli Date: Mon, 16 Sep 2024 07:03:28 +0700 Subject: [PATCH 1/4] chore: use biome and vitest, remove everything else --- .eslintignore | 8 - .eslintrc | 24 - .github/workflows/ci.yml | 3 +- .husky/commit-msg | 5 +- .husky/pre-commit | 6 +- .prettierignore | 7 - .prettierrc | 7 - CONTRIBUTING.md | 2 +- biome.json | 48 + ...itlint.config.cjs => commitlint.config.mjs | 5 +- package.json | 68 +- pnpm-lock.yaml | 3982 ++++++----------- rollup.config.js | 13 - src/index.ts | 6 +- src/token.ts | 2 +- src/utils.ts | 2 +- tests/cookie.spec.ts | 231 - tests/cookie.test.ts | 262 ++ tests/failing.spec.ts | 64 - tests/failing.test.ts | 71 + tests/helper.ts | 10 +- tests/session.spec.ts | 221 - tests/session.test.ts | 247 + tests/signedCookie.spec.ts | 234 - tests/signedCookie.test.ts | 257 ++ tests/utils.spec.ts | 41 +- tsconfig.json | 2 +- vitest.config.ts | 12 + 28 files changed, 2411 insertions(+), 3429 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc delete mode 100644 .prettierignore delete mode 100644 .prettierrc create mode 100644 biome.json rename commitlint.config.cjs => commitlint.config.mjs (62%) delete mode 100644 rollup.config.js delete mode 100644 tests/cookie.spec.ts create mode 100644 tests/cookie.test.ts delete mode 100644 tests/failing.spec.ts create mode 100644 tests/failing.test.ts delete mode 100644 tests/session.spec.ts create mode 100644 tests/session.test.ts delete mode 100644 tests/signedCookie.spec.ts create mode 100644 tests/signedCookie.test.ts create mode 100644 vitest.config.ts diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 0d96c0e..0000000 --- a/.eslintignore +++ /dev/null @@ -1,8 +0,0 @@ -node_modules -dist -coverage -examples/dev-server/public/sosseDevSocketClient/main.umd.js -./**/node_modules/ -benchmark -site/static/js/index.js -examples/aws/.build \ No newline at end of file diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 638e5aa..0000000 --- a/.eslintrc +++ /dev/null @@ -1,24 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "prettier"], - "plugins": ["@typescript-eslint"], - "parserOptions": { - "ecmaVersion": 2020, - "sourceType": "module" - }, - "env": { - "node": true, - "es6": true, - "jest": true - }, - "rules": { - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-unused-vars": "off", - "@typescript-eslint/explicit-module-boundary-types": "off", - "@typescript-eslint/ban-ts-comment": "off", - "no-unused-vars": "off", - "no-console": "off", - "no-undef": "off" - } -} \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3b48601..6d83b40 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -30,9 +30,8 @@ jobs: version: 8 - run: pnpm install - run: pnpm test:coverage - - run: pnpm test:report - name: Coveralls uses: coverallsapp/github-action@master with: github-token: ${{ secrets.GITHUB_TOKEN }} - path-to-lcov: ./coverage.lcov + path-to-lcov: ./coverage/lcov.info diff --git a/.husky/commit-msg b/.husky/commit-msg index f6ca9c6..6248f3b 100755 --- a/.husky/commit-msg +++ b/.husky/commit-msg @@ -1,4 +1 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -npx --no-install commitlint --config commitlint.config.cjs --edit "$1" \ No newline at end of file +npx --no-install commitlint --config commitlint.config.mjs --edit "$1" \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit index 367adc4..480ba8b 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,2 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -pnpm format && pnpm lint && pnpm build && pnpm test \ No newline at end of file +pnpm check +pnpm test diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 558db31..0000000 --- a/.prettierignore +++ /dev/null @@ -1,7 +0,0 @@ -node_modules -dist -coverage -examples/dev-server/public/sosseDevSocketClient/main.umd.js -.next -packages/*/dist -examples/aws/.build \ No newline at end of file diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index e49e609..0000000 --- a/.prettierrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "semi": false, - "singleQuote": true, - "printWidth": 120, - "trailingComma": "none", - "tabWidth": 2 -} \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 56d39f9..e4cfba6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -41,7 +41,7 @@ pnpm i ### Formatting -If you use VS Code, please install Prettier and ESLint plugins for proper linting and code formatting. +If you use VS Code, please install Biome plugin for proper linting and code formatting. If you use a text editor that doesn't have Prettier integration, you can run `pnpx format:fix"` diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..cddff55 --- /dev/null +++ b/biome.json @@ -0,0 +1,48 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.8.2/schema.json", + "files": { + "ignore": ["node_modules", "dist", "coverage", ".pnpm-store"] + }, + "formatter": { + "enabled": true, + "formatWithErrors": false, + "indentStyle": "space", + "indentWidth": 2, + "lineEnding": "lf", + "lineWidth": 120, + "attributePosition": "auto" + }, + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "correctness": { + "noVoidTypeReturn": "off" + }, + "style": { + "noParameterAssign": "off", + "noNonNullAssertion": "off" + }, + "suspicious": { + "noAssignInExpressions": "off", + "noExplicitAny": "off" + } + } + }, + "javascript": { + "formatter": { + "jsxQuoteStyle": "double", + "quoteProperties": "asNeeded", + "trailingCommas": "none", + "semicolons": "asNeeded", + "arrowParentheses": "always", + "bracketSpacing": true, + "bracketSameLine": false, + "quoteStyle": "single", + "attributePosition": "auto" + } + } +} diff --git a/commitlint.config.cjs b/commitlint.config.mjs similarity index 62% rename from commitlint.config.cjs rename to commitlint.config.mjs index bfbf309..fe00e26 100644 --- a/commitlint.config.cjs +++ b/commitlint.config.mjs @@ -1,7 +1,6 @@ -// eslint-disable-next-line @typescript-eslint/no-var-requires -const defaultConfig = require('@commitlint/config-conventional') +import defaultConfig from '@commitlint/config-conventional' -module.exports = { +export default { extends: ['@commitlint/config-conventional'], rules: { ...defaultConfig.rules, diff --git a/package.json b/package.json index 7389ade..08146b0 100644 --- a/package.json +++ b/package.json @@ -2,32 +2,21 @@ "name": "malibu", "version": "1.0.6", "description": "Framework-agnostic CSRF middleware", - "keywords": [ - "csrf", - "middleware", - "tokens", - "framework agnostic", - "express", - "tinyhttp", - "polka", - "http" - ], + "keywords": ["csrf", "middleware", "tokens", "framework agnostic", "express", "tinyhttp", "polka", "http"], "author": "Reinaldy Rafli ", "license": "MIT", "type": "module", "types": "./dist/index.d.ts", "exports": "./dist/index.js", - "files": [ - "dist" - ], + "files": ["dist"], "scripts": { - "build": "rollup -c", - "test": "uvu -r tsm tests", - "test:coverage": "c8 --include=src pnpm test", - "test:report": "c8 report --reporter=text-lcov > coverage.lcov", - "lint": "eslint \"./**/*.ts\"", - "format": "prettier --write \"./**/*.ts\"", - "prepare": "husky install" + "build": "tsc", + "test": "vitest run", + "test:coverage": "vitest run --coverage", + "lint": "biome lint .", + "format": "biome format .", + "check": "biome check .", + "prepare": "husky" }, "repository": { "type": "git", @@ -45,32 +34,23 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "devDependencies": { - "@commitlint/cli": "17.7.2", - "@commitlint/config-conventional": "17.7.0", - "@rollup/plugin-typescript": "11.1.4", - "@tinyhttp/app": "2.0.32", + "@biomejs/biome": "1.9.1", + "@commitlint/cli": "19.5.0", + "@commitlint/config-conventional": "19.5.0", + "@tinyhttp/app": "2.4.0", "@tinyhttp/cookie-parser": "2.0.6", - "@types/express-session": "1.17.8", - "@types/node": "20.8.0", - "@typescript-eslint/eslint-plugin": "6.7.3", - "@typescript-eslint/parser": "6.7.3", - "c8": "8.0.1", - "eslint": "8.50.0", - "eslint-config-prettier": "9.0.0", - "eslint-plugin-prettier": "5.0.0", - "express-session": "1.17.3", - "husky": "8.0.3", - "milliparsec": "2.3.0", - "prettier": "3.0.3", - "rollup": "3.29.4", - "supertest-fetch": "1.5.0", - "tslib": "2.6.2", - "tsm": "^2.3.0", - "typescript": "5.2.2", - "uvu": "0.5.6" + "@types/express-session": "1.18.0", + "@types/node": "22.5.5", + "@vitest/coverage-v8": "2.1.1", + "express-session": "1.18.0", + "husky": "9.1.6", + "milliparsec": "4.0.0", + "supertest-fetch": "2.0.0", + "typescript": "5.6.2", + "vitest": "2.1.1" }, "dependencies": { - "@tinyhttp/cookie": "2.1.0", - "@tinyhttp/cookie-signature": "2.1.0" + "@tinyhttp/cookie": "2.1.1", + "@tinyhttp/cookie-signature": "2.1.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a55446b..57ffac8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,363 +9,533 @@ importers: .: dependencies: '@tinyhttp/cookie': - specifier: 2.1.0 - version: 2.1.0 + specifier: 2.1.1 + version: 2.1.1 '@tinyhttp/cookie-signature': - specifier: 2.1.0 - version: 2.1.0 + specifier: 2.1.1 + version: 2.1.1 devDependencies: + '@biomejs/biome': + specifier: 1.9.1 + version: 1.9.1 '@commitlint/cli': - specifier: 17.7.2 - version: 17.7.2 + specifier: 19.5.0 + version: 19.5.0(@types/node@22.5.5)(typescript@5.6.2) '@commitlint/config-conventional': - specifier: 17.7.0 - version: 17.7.0 - '@rollup/plugin-typescript': - specifier: 11.1.4 - version: 11.1.4(rollup@3.29.4)(tslib@2.6.2)(typescript@5.2.2) + specifier: 19.5.0 + version: 19.5.0 '@tinyhttp/app': - specifier: 2.0.32 - version: 2.0.32 + specifier: 2.4.0 + version: 2.4.0 '@tinyhttp/cookie-parser': specifier: 2.0.6 version: 2.0.6 '@types/express-session': - specifier: 1.17.8 - version: 1.17.8 + specifier: 1.18.0 + version: 1.18.0 '@types/node': - specifier: 20.8.0 - version: 20.8.0 - '@typescript-eslint/eslint-plugin': - specifier: 6.7.3 - version: 6.7.3(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0)(typescript@5.2.2) - '@typescript-eslint/parser': - specifier: 6.7.3 - version: 6.7.3(eslint@8.50.0)(typescript@5.2.2) - c8: - specifier: 8.0.1 - version: 8.0.1 - eslint: - specifier: 8.50.0 - version: 8.50.0 - eslint-config-prettier: - specifier: 9.0.0 - version: 9.0.0(eslint@8.50.0) - eslint-plugin-prettier: - specifier: 5.0.0 - version: 5.0.0(eslint-config-prettier@9.0.0(eslint@8.50.0))(eslint@8.50.0)(prettier@3.0.3) + specifier: 22.5.5 + version: 22.5.5 + '@vitest/coverage-v8': + specifier: 2.1.1 + version: 2.1.1(vitest@2.1.1(@types/node@22.5.5)) express-session: - specifier: 1.17.3 - version: 1.17.3 + specifier: 1.18.0 + version: 1.18.0 husky: - specifier: 8.0.3 - version: 8.0.3 + specifier: 9.1.6 + version: 9.1.6 milliparsec: - specifier: 2.3.0 - version: 2.3.0 - prettier: - specifier: 3.0.3 - version: 3.0.3 - rollup: - specifier: 3.29.4 - version: 3.29.4 + specifier: 4.0.0 + version: 4.0.0 supertest-fetch: - specifier: 1.5.0 - version: 1.5.0 - tslib: - specifier: 2.6.2 - version: 2.6.2 - tsm: - specifier: ^2.3.0 - version: 2.3.0 + specifier: 2.0.0 + version: 2.0.0 typescript: - specifier: 5.2.2 - version: 5.2.2 - uvu: - specifier: 0.5.6 - version: 0.5.6 + specifier: 5.6.2 + version: 5.6.2 + vitest: + specifier: 2.1.1 + version: 2.1.1(@types/node@22.5.5) packages: - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} '@babel/code-frame@7.18.6': resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.19.1': - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} '@babel/highlight@7.18.6': resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} + '@babel/parser@7.25.6': + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.25.6': + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@commitlint/cli@17.7.2': - resolution: {integrity: sha512-t3N7TZq7lOeqTOyEgfGcaltHqEJf7YDlPg75MldeVPPyz14jZq/+mbGF9tueDLFX8R6RwdymrN6D+U5XwZ8Iwg==} - engines: {node: '>=v14'} + '@biomejs/biome@1.9.1': + resolution: {integrity: sha512-Ps0Rg0zg3B1zpx+zQHMz5b0n0PBNCAaXttHEDTVrJD5YXR6Uj3T+abTDgeS3wsu4z5i2whqcE1lZxGyWH4bZYg==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@1.9.1': + resolution: {integrity: sha512-js0brHswq/BoeKgfSEUJYOjUOlML6p65Nantti+PsoQ61u9+YVGIZ7325LK7iUpDH8KVJT+Bx7K2b/6Q//W1Pw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@1.9.1': + resolution: {integrity: sha512-2zVyjUg5rN0k8XrytkubQWLbp2r/AS5wPhXs4vgVjvqbLnzo32EGX8p61gzroF2dH9DCUCfskdrigCGqNdEbpg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@1.9.1': + resolution: {integrity: sha512-L/JmXKvhsZ1lTgqOr3tWkzuY/NRppdIscHeC9aaiR72WjnBgJS94mawl9BWmGB3aWBc0q6oSDWnBS7617EMMmA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@1.9.1': + resolution: {integrity: sha512-QgxwfnG+r2aer5RNGR67Ey91Tv7xXW8E9YckHhwuyWjdLEvKWkrSJrhVG/6ub0kVvTSNkYOuT/7/jMOFBuUbRA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@1.9.1': + resolution: {integrity: sha512-gY+eFLIAW45v3WicQHicvjRfA0ntMZHx7h937bXwBMFNFoKmB6rMi6+fKQ6/hiS6juhsFxZdZIz20m15s49J6A==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@1.9.1': + resolution: {integrity: sha512-F0INygtzI2L2n2R1KtYHGr3YWDt9Up1zrUluwembM+iJ1dXN3qzlSb7deFUsSJm4FaIPriqs6Xa56ukdQW6UeQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@1.9.1': + resolution: {integrity: sha512-7Jahxar3OB+aTPOgXisMJmMKMsjcK+UmdlG3UIOQjzN/ZFEsPV+GT3bfrVjZDQaCw/zes0Cqd7VTWFjFTC/+MQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@1.9.1': + resolution: {integrity: sha512-liSRWjWzFhyG7s1jg/Bbv9FL+ha/CEd5tFO3+dFIJNplL4TnvAivtyfRVi/tu/pNjISbV1k9JwdBewtAKAgA0w==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@commitlint/cli@19.5.0': + resolution: {integrity: sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ==} + engines: {node: '>=v18'} hasBin: true - '@commitlint/config-conventional@17.7.0': - resolution: {integrity: sha512-iicqh2o6et+9kWaqsQiEYZzfLbtoWv9uZl8kbI8EGfnc0HeGafQBF7AJ0ylN9D/2kj6txltsdyQs8+2fTMwWEw==} - engines: {node: '>=v14'} + '@commitlint/config-conventional@19.5.0': + resolution: {integrity: sha512-OBhdtJyHNPryZKg0fFpZNOBM1ZDbntMvqMuSmpfyP86XSfwzGw4CaoYRG4RutUPg0BTK07VMRIkNJT6wi2zthg==} + engines: {node: '>=v18'} + + '@commitlint/config-validator@19.5.0': + resolution: {integrity: sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==} + engines: {node: '>=v18'} - '@commitlint/config-validator@17.6.7': - resolution: {integrity: sha512-vJSncmnzwMvpr3lIcm0I8YVVDJTzyjy7NZAeXbTXy+MPUdAr9pKyyg7Tx/ebOQ9kqzE6O9WT6jg2164br5UdsQ==} - engines: {node: '>=v14'} + '@commitlint/ensure@19.5.0': + resolution: {integrity: sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==} + engines: {node: '>=v18'} - '@commitlint/ensure@17.6.7': - resolution: {integrity: sha512-mfDJOd1/O/eIb/h4qwXzUxkmskXDL9vNPnZ4AKYKiZALz4vHzwMxBSYtyL2mUIDeU9DRSpEUins8SeKtFkYHSw==} - engines: {node: '>=v14'} + '@commitlint/execute-rule@19.5.0': + resolution: {integrity: sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==} + engines: {node: '>=v18'} - '@commitlint/execute-rule@17.4.0': - resolution: {integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==} - engines: {node: '>=v14'} + '@commitlint/format@19.5.0': + resolution: {integrity: sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==} + engines: {node: '>=v18'} - '@commitlint/format@17.4.4': - resolution: {integrity: sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==} - engines: {node: '>=v14'} + '@commitlint/is-ignored@19.5.0': + resolution: {integrity: sha512-0XQ7Llsf9iL/ANtwyZ6G0NGp5Y3EQ8eDQSxv/SRcfJ0awlBY4tHFAvwWbw66FVUaWICH7iE5en+FD9TQsokZ5w==} + engines: {node: '>=v18'} - '@commitlint/is-ignored@17.7.0': - resolution: {integrity: sha512-043rA7m45tyEfW7Zv2vZHF++176MLHH9h70fnPoYlB1slKBeKl8BwNIlnPg4xBdRBVNPaCqvXxWswx2GR4c9Hw==} - engines: {node: '>=v14'} + '@commitlint/lint@19.5.0': + resolution: {integrity: sha512-cAAQwJcRtiBxQWO0eprrAbOurtJz8U6MgYqLz+p9kLElirzSCc0vGMcyCaA1O7AqBuxo11l1XsY3FhOFowLAAg==} + engines: {node: '>=v18'} - '@commitlint/lint@17.7.0': - resolution: {integrity: sha512-TCQihm7/uszA5z1Ux1vw+Nf3yHTgicus/+9HiUQk+kRSQawByxZNESeQoX9ujfVd3r4Sa+3fn0JQAguG4xvvbA==} - engines: {node: '>=v14'} + '@commitlint/load@19.5.0': + resolution: {integrity: sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA==} + engines: {node: '>=v18'} - '@commitlint/load@17.7.2': - resolution: {integrity: sha512-XA7WTnsjHZ4YH6ZYsrnxgLdXzriwMMq+utZUET6spbOEEIPBCDLdOQXS26P+v3TTO4hUHOEhzUquaBv3jbBixw==} - engines: {node: '>=v14'} + '@commitlint/message@19.5.0': + resolution: {integrity: sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==} + engines: {node: '>=v18'} - '@commitlint/message@17.4.2': - resolution: {integrity: sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==} - engines: {node: '>=v14'} + '@commitlint/parse@19.5.0': + resolution: {integrity: sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==} + engines: {node: '>=v18'} - '@commitlint/parse@17.7.0': - resolution: {integrity: sha512-dIvFNUMCUHqq5Abv80mIEjLVfw8QNuA4DS7OWip4pcK/3h5wggmjVnlwGCDvDChkw2TjK1K6O+tAEV78oxjxag==} - engines: {node: '>=v14'} + '@commitlint/read@19.5.0': + resolution: {integrity: sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==} + engines: {node: '>=v18'} - '@commitlint/read@17.5.1': - resolution: {integrity: sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==} - engines: {node: '>=v14'} + '@commitlint/resolve-extends@19.5.0': + resolution: {integrity: sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==} + engines: {node: '>=v18'} - '@commitlint/resolve-extends@17.6.7': - resolution: {integrity: sha512-PfeoAwLHtbOaC9bGn/FADN156CqkFz6ZKiVDMjuC2N5N0740Ke56rKU7Wxdwya8R8xzLK9vZzHgNbuGhaOVKIg==} - engines: {node: '>=v14'} + '@commitlint/rules@19.5.0': + resolution: {integrity: sha512-hDW5TPyf/h1/EufSHEKSp6Hs+YVsDMHazfJ2azIk9tHPXS6UqSz1dIRs1gpqS3eMXgtkT7JH6TW4IShdqOwhAw==} + engines: {node: '>=v18'} - '@commitlint/rules@17.7.0': - resolution: {integrity: sha512-J3qTh0+ilUE5folSaoK91ByOb8XeQjiGcdIdiB/8UT1/Rd1itKo0ju/eQVGyFzgTMYt8HrDJnGTmNWwcMR1rmA==} - engines: {node: '>=v14'} + '@commitlint/to-lines@19.5.0': + resolution: {integrity: sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==} + engines: {node: '>=v18'} - '@commitlint/to-lines@17.4.0': - resolution: {integrity: sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==} - engines: {node: '>=v14'} + '@commitlint/top-level@19.5.0': + resolution: {integrity: sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==} + engines: {node: '>=v18'} - '@commitlint/top-level@17.4.0': - resolution: {integrity: sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==} - engines: {node: '>=v14'} + '@commitlint/types@19.5.0': + resolution: {integrity: sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==} + engines: {node: '>=v18'} - '@commitlint/types@17.4.4': - resolution: {integrity: sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==} - engines: {node: '>=v14'} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} + cpu: [arm64] + os: [android] - '@esbuild/android-arm@0.15.18': - resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] - '@esbuild/linux-loong64@0.15.18': - resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - '@eslint-community/eslint-utils@4.2.0': - resolution: {integrity: sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] - '@eslint-community/regexpp@4.9.0': - resolution: {integrity: sha512-zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] - '@eslint/eslintrc@2.1.2': - resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] - '@eslint/js@8.50.0': - resolution: {integrity: sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] - '@humanwhocodes/config-array@0.11.11': - resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] - '@humanwhocodes/object-schema@1.2.1': - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - deprecated: Use @eslint/object-schema instead + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} '@istanbuljs/schema@0.1.3': resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + '@jridgewell/resolve-uri@3.1.0': resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec@1.4.14': resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - '@jridgewell/trace-mapping@0.3.17': - resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@rollup/rollup-android-arm-eabi@4.21.3': + resolution: {integrity: sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==} + cpu: [arm] + os: [android] - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@rollup/rollup-android-arm64@4.21.3': + resolution: {integrity: sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==} + cpu: [arm64] + os: [android] - '@pkgr/utils@2.4.2': - resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@rollup/rollup-darwin-arm64@4.21.3': + resolution: {integrity: sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==} + cpu: [arm64] + os: [darwin] - '@rollup/plugin-typescript@11.1.4': - resolution: {integrity: sha512-WZRh5LBVLQXdKFICUId5J3eIpmjGURaBqntfg3GSZACgeOAFS+lOSMGTwfzDkELTaZVp/lWdMVNU3UkwCUBg/Q==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.14.0||^3.0.0 - tslib: '*' - typescript: '>=3.7.0' - peerDependenciesMeta: - rollup: - optional: true - tslib: - optional: true + '@rollup/rollup-darwin-x64@4.21.3': + resolution: {integrity: sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==} + cpu: [x64] + os: [darwin] - '@rollup/pluginutils@5.0.2': - resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.21.3': + resolution: {integrity: sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==} + cpu: [arm] + os: [linux] - '@tinyhttp/accepts@2.0.8': - resolution: {integrity: sha512-+/QwWAXDKiQwr1ce+azdCEbUFNv5MgJGr8/anwyIODFuFXVZ33iukgUeCSpszy7KvFB0RbuPXQjtMpii12ejuA==} - engines: {node: '>=12.4.0'} + '@rollup/rollup-linux-arm-musleabihf@4.21.3': + resolution: {integrity: sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==} + cpu: [arm] + os: [linux] - '@tinyhttp/app@2.0.32': - resolution: {integrity: sha512-isz/eyWzOv6RkY3wgsD3IdX1lWNzRNFponAFCQdOZpuHvdaLycT2tOW3dylxcryJ7WwzXeIF7cvTUxoK/f5Y7w==} - engines: {node: '>=12.x'} + '@rollup/rollup-linux-arm64-gnu@4.21.3': + resolution: {integrity: sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==} + cpu: [arm64] + os: [linux] - '@tinyhttp/content-disposition@2.0.9': - resolution: {integrity: sha512-ERzNxML7GoR9tPo6qcKOsqlfLLWVUpIwNwZQw/9XRpDJJyJ5CL1pQVdsCKWpqN6tiu0zdGQyEZ1c8Tw4iu14kA==} - engines: {node: '>=12.4.0'} + '@rollup/rollup-linux-arm64-musl@4.21.3': + resolution: {integrity: sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==} + cpu: [arm64] + os: [linux] - '@tinyhttp/cookie-parser@2.0.6': - resolution: {integrity: sha512-hLcFr3ml6MBU71URUutvzh8p0PgqGpmTMcorUrRS+Fck0/q3tzScE+ghhocgIoSx/F6GRtS/TYJkJrjL/ickBw==} - engines: {node: '>=12.4 || 14.x || >=16'} + '@rollup/rollup-linux-powerpc64le-gnu@4.21.3': + resolution: {integrity: sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.21.3': + resolution: {integrity: sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.21.3': + resolution: {integrity: sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.21.3': + resolution: {integrity: sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==} + cpu: [x64] + os: [linux] - '@tinyhttp/cookie-signature@2.0.6': - resolution: {integrity: sha512-ETEkKy9okt/hakLoNORK0a5UNzh6QEOJyngtb5fY1vbUc88phOio1mtq+iAPs45tlDx3scTk9mcmSglzbRFbXA==} - engines: {node: '>=12.4.0'} + '@rollup/rollup-linux-x64-musl@4.21.3': + resolution: {integrity: sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.21.3': + resolution: {integrity: sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.21.3': + resolution: {integrity: sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==} + cpu: [ia32] + os: [win32] - '@tinyhttp/cookie-signature@2.1.0': - resolution: {integrity: sha512-bpOXBGf9rKoajtEG75O7xjwW+u2I/NNPkJWJTDdr6j7Vx0lG5R9Hnl3ty80Af4jwyo90ywXVpZIxKLubPK6RzA==} + '@rollup/rollup-win32-x64-msvc@4.21.3': + resolution: {integrity: sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==} + cpu: [x64] + os: [win32] + + '@tinyhttp/accepts@2.2.3': + resolution: {integrity: sha512-9pQN6pJAJOU3McmdJWTcyq7LLFW8Lj5q+DadyKcvp+sxMkEpktKX5sbfJgJuOvjk6+1xWl7pe0YL1US1vaO/1w==} engines: {node: '>=12.20.0'} - '@tinyhttp/cookie@2.0.6': - resolution: {integrity: sha512-aiRoK8YrzzcjHoL4kf1f44X6aCCWOkaMMnTfKYM4vmSEA2QNZPKU/DW1O06Wuv5TUHXnu2Kxtf0jV/OV1Inojg==} - engines: {node: '>=12.4.0'} + '@tinyhttp/app@2.4.0': + resolution: {integrity: sha512-vOPiCemQRJq5twnl06dde6XnWiNbVMdVRFJWW/yC/9G0qgvV2TvzNNTxrdlz6YmyB7vIC7Fg3qS6m6gx8RbBNQ==} + engines: {node: '>=14.21.3'} - '@tinyhttp/cookie@2.1.0': - resolution: {integrity: sha512-o56utxXvIuLTCtPm66r8lcyUufpw0RkO+u4wQrTbc6snyyGZZ9hHzGRxPyko0ks90ctOkLh0mNKn7YZaTWlvfw==} + '@tinyhttp/content-disposition@2.2.2': + resolution: {integrity: sha512-crXw1txzrS36huQOyQGYFvhTeLeG0Si1xu+/l6kXUVYpE0TjFjEZRqTbuadQLfKGZ0jaI+jJoRyqaWwxOSHW2g==} engines: {node: '>=12.20.0'} - '@tinyhttp/encode-url@2.0.7': - resolution: {integrity: sha512-YFOKF+WR4T08Gmldj6/fQVVRWlRqH7yvxpZwUGrxJi06ns73nkuS8ykFSm9/e+n69eRpnAcF+ZN2DKZYIa/Kcg==} - engines: {node: '>=12.4.0'} + '@tinyhttp/content-type@0.1.4': + resolution: {integrity: sha512-dl6f3SHIJPYbhsW1oXdrqOmLSQF/Ctlv3JnNfXAE22kIP7FosqJHxkz/qj2gv465prG8ODKH5KEyhBkvwrueKQ==} + engines: {node: '>=12.4'} + + '@tinyhttp/cookie-parser@2.0.6': + resolution: {integrity: sha512-hLcFr3ml6MBU71URUutvzh8p0PgqGpmTMcorUrRS+Fck0/q3tzScE+ghhocgIoSx/F6GRtS/TYJkJrjL/ickBw==} + engines: {node: '>=12.4 || 14.x || >=16'} - '@tinyhttp/etag@2.0.6': - resolution: {integrity: sha512-7mX8kERzYFKDz0MD2upgp1qjst8fbDq7dVOGp0V2+MPWUzhztLBuhJ1Pbu05QypDhSGPvkOM0onSnzbWkrv5ZQ==} - engines: {node: '>=12.4.0'} + '@tinyhttp/cookie-signature@2.1.1': + resolution: {integrity: sha512-VDsSMY5OJfQJIAtUgeQYhqMPSZptehFSfvEEtxr+4nldPA8IImlp3QVcOVuK985g4AFR4Hl1sCbWCXoqBnVWnw==} + engines: {node: '>=12.20.0'} - '@tinyhttp/forwarded@2.0.6': - resolution: {integrity: sha512-0DtpuA2KhnTdPlofhuy2KEbcvqLiDXLSqgDzZgxiyFTkcGaL5YzgUMNpNkRbczckJXC1BXgNCrxw58f9wS8nxw==} - engines: {node: '>=12.4.0'} + '@tinyhttp/cookie@2.1.1': + resolution: {integrity: sha512-h/kL9jY0e0Dvad+/QU3efKZww0aTvZJslaHj3JTPmIPC9Oan9+kYqmh3M6L5JUQRuTJYFK2nzgL2iJtH2S+6dA==} + engines: {node: '>=12.20.0'} - '@tinyhttp/proxy-addr@2.0.7': - resolution: {integrity: sha512-aB5TvrKkg8iyi8781ajlNCq2Q6dTuY/LmrJq0I6tqxK6ozvCKzghy9qbQmGMPOnLpRxO04cF1+9ze74Yy5mFqw==} - engines: {node: '>=12.4.0'} + '@tinyhttp/encode-url@2.1.1': + resolution: {integrity: sha512-AhY+JqdZ56qV77tzrBm0qThXORbsVjs/IOPgGCS7x/wWnsa/Bx30zDUU/jPAUcSzNOzt860x9fhdGpzdqbUeUw==} + engines: {node: '>=12.20.0'} - '@tinyhttp/req@2.0.16': - resolution: {integrity: sha512-zSDbusEf6qfAyGhUNAuMSPo81aaN67Fpluf0C+AR2CbKjzoDVaUhTyWqkA14x5QkJICHksmGObBJiXG32ln5mw==} - engines: {node: '>=12.4.0'} + '@tinyhttp/etag@2.1.2': + resolution: {integrity: sha512-j80fPKimGqdmMh6962y+BtQsnYPVCzZfJw0HXjyH70VaJBHLKGF+iYhcKqzI3yef6QBNa8DKIPsbEYpuwApXTw==} + engines: {node: '>=12.20.0'} - '@tinyhttp/res@2.0.23': - resolution: {integrity: sha512-zAhsrFCkKpuMGej7/IQjkfEasl8r17pfR4x4F/521Iki7yoBmZ8E0q27MJoSLMaBYj5yD7dwb5uwr3iUrB0O9w==} - engines: {node: '>=12.4.0'} + '@tinyhttp/forwarded@2.1.1': + resolution: {integrity: sha512-nO3kq0R1LRl2+CAMlnggm22zE6sT8gfvGbNvSitV6F9eaUSurHP0A8YZFMihSkugHxK+uIegh1TKrqgD8+lyGQ==} + engines: {node: '>=12.20.0'} - '@tinyhttp/router@2.1.0': - resolution: {integrity: sha512-IiRvUsJ96M3JgnYtmcL3NPLJ3Bfw1eGCu8c4gpkpJAD1zxaHHjQK2I4BbpK3o8img7I9nzG+pNgtuPkyf2eG3w==} - engines: {node: '>=12.4.0'} + '@tinyhttp/proxy-addr@2.2.0': + resolution: {integrity: sha512-WM/PPL9xNvrs7/8Om5nhKbke5FHrP3EfjOOR+wBnjgESfibqn0K7wdUTnzSLp1lBmemr88os1XvzwymSgaibyA==} + engines: {node: '>=12.20.0'} - '@tinyhttp/send@2.0.8': - resolution: {integrity: sha512-atmThMLKHV+Pldem8fynNZqWYTcRyoK98KB3FuXFueEBjjHVwhNENU51GIeCeFVFAywMIMlt2HReeJ+DzGpyUg==} - engines: {node: '>=12.4.0'} + '@tinyhttp/req@2.2.4': + resolution: {integrity: sha512-lQAZIAo0NOeghxFOZS57tQzxpHSPPLs9T68Krq2BncEBImKwqaDKUt7M9Y5Kb+rvC/GwIL3LeErhkg7f5iG4IQ==} + engines: {node: '>=12.20.0'} - '@tinyhttp/type-is@2.0.7': - resolution: {integrity: sha512-UGxPNtjoAmJCro2FGOH8FWQSY3XVRB+/t5ZZcBmr0Jmg/FsH38OPSEhpqDTqAO0iojY7h/Rs0+d3cKd6PlOeog==} - engines: {node: '>=12.4.0'} + '@tinyhttp/res@2.2.4': + resolution: {integrity: sha512-ETBRShnO19oJyIg2XQHQoofXPWeTXPAuwnIVYkU8WaftvXd/Vz4y5+WFQDHUzKlmdGOw5fAFnrEU7pIVMeFeVA==} + engines: {node: '>=12.20.0'} - '@tinyhttp/url@2.0.8': - resolution: {integrity: sha512-Z3ZJ2tq2of7LAfzYqrtNH7jAi/2dSs10c2s1LpuLt1MjIyA2HtGB0x+LKvb7e5jbxOZlFBbeI3ubQODbGf7IKw==} - engines: {node: '>=12.4.0'} + '@tinyhttp/router@2.2.3': + resolution: {integrity: sha512-O0MQqWV3Vpg/uXsMYg19XsIgOhwjyhTYWh51Qng7bxqXixxx2PEvZWnFjP7c84K7kU/nUX41KpkEBTLnznk9/Q==} + engines: {node: '>=12.20.0'} - '@tsconfig/node10@1.0.9': - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + '@tinyhttp/send@2.2.3': + resolution: {integrity: sha512-o4cVHHGQ8WjVBS8UT0EE/2WnjoybrfXikHwsRoNlG1pfrC/Sd01u1N4Te8cOd/9aNGLr4mGxWb5qTm2RRtEi7g==} + engines: {node: '>=12.20.0'} - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + '@tinyhttp/type-is@2.2.4': + resolution: {integrity: sha512-7F328NheridwjIfefBB2j1PEcKKABpADgv7aCJaE8x8EON77ZFrAkI3Rir7pGjopV7V9MBmW88xUQigBEX2rmQ==} + engines: {node: '>=12.20.0'} - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + '@tinyhttp/url@2.1.1': + resolution: {integrity: sha512-POJeq2GQ5jI7Zrdmj22JqOijB5/GeX+LEX7DUdml1hUnGbJOTWDx7zf2b5cCERj7RoXL67zTgyzVblBJC+NJWg==} + engines: {node: '>=12.20.0'} - '@tsconfig/node16@1.0.3': - resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + '@tinyhttp/vary@0.1.3': + resolution: {integrity: sha512-SoL83sQXAGiHN1jm2VwLUWQSQeDAAl1ywOm6T0b0Cg1CZhVsjoiZadmjhxF6FHCCY7OHHVaLnTgSMxTPIDLxMg==} + engines: {node: '>=12.20'} '@types/body-parser@1.19.2': resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} @@ -373,41 +543,29 @@ packages: '@types/connect@3.4.35': resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + '@types/conventional-commits-parser@5.0.0': + resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} + '@types/estree@1.0.0': resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/express-serve-static-core@4.17.33': resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} - '@types/express-session@1.17.8': - resolution: {integrity: sha512-bFF7/3wOldMn+56XyFRGY9ZzCr3JWhNSP2ajMPgTlbZR6BQOCHdAbNA9W5dMBPgMywpIP4zkmhxP6Opm/NRYMQ==} + '@types/express-session@1.18.0': + resolution: {integrity: sha512-27JdDRgor6PoYlURY+Y5kCakqp5ulC0kmf7y+QwaY+hv9jEFuQOThgkjyA53RP3jmKuBsH5GR6qEfFmvb8mwOA==} '@types/express@4.17.17': resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} - '@types/istanbul-lib-coverage@2.0.4': - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - - '@types/json-schema@7.0.13': - resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} - '@types/mime@3.0.1': resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} - '@types/minimist@1.2.2': - resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} - - '@types/node-fetch@2.6.2': - resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} - - '@types/node@20.5.1': - resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==} - - '@types/node@20.8.0': - resolution: {integrity: sha512-LzcWltT83s1bthcvjBmiBvGJiiUe84NWRHkw+ZV6Fr41z2FbIzvc815dk2nQ3RAKMuN2fkenM/z3Xv2QzEpYxQ==} - - '@types/normalize-package-data@2.4.1': - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + '@types/node@22.5.5': + resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} '@types/qs@6.9.7': resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} @@ -415,96 +573,52 @@ packages: '@types/range-parser@1.2.4': resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} - '@types/semver@7.5.3': - resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==} - '@types/serve-static@1.15.1': resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} - '@typescript-eslint/eslint-plugin@6.7.3': - resolution: {integrity: sha512-vntq452UHNltxsaaN+L9WyuMch8bMd9CqJ3zhzTPXXidwbf5mqqKCVXEuvRZUqLJSTLeWE65lQwyXsRGnXkCTA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@6.7.3': - resolution: {integrity: sha512-TlutE+iep2o7R8Lf+yoer3zU6/0EAUc8QIBB3GYBc1KGz4c4TRm83xwXUZVPlZ6YCLss4r77jbu6j3sendJoiQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@vitest/coverage-v8@2.1.1': + resolution: {integrity: sha512-md/A7A3c42oTT8JUHSqjP5uKTWJejzUW4jalpvs+rZ27gsURsMU8DEb+8Jf8C6Kj2gwfSHJqobDNBuoqlm0cFw==} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' + '@vitest/browser': 2.1.1 + vitest: 2.1.1 peerDependenciesMeta: - typescript: + '@vitest/browser': optional: true - '@typescript-eslint/scope-manager@6.7.3': - resolution: {integrity: sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@vitest/expect@2.1.1': + resolution: {integrity: sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==} - '@typescript-eslint/type-utils@6.7.3': - resolution: {integrity: sha512-Fc68K0aTDrKIBvLnKTZ5Pf3MXK495YErrbHb1R6aTpfK5OdSFj0rVN7ib6Tx6ePrZ2gsjLqr0s98NG7l96KSQw==} - engines: {node: ^16.0.0 || >=18.0.0} + '@vitest/mocker@2.1.1': + resolution: {integrity: sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' + '@vitest/spy': 2.1.1 + msw: ^2.3.5 + vite: ^5.0.0 peerDependenciesMeta: - typescript: + msw: optional: true - - '@typescript-eslint/types@6.7.3': - resolution: {integrity: sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/typescript-estree@6.7.3': - resolution: {integrity: sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: + vite: optional: true - '@typescript-eslint/utils@6.7.3': - resolution: {integrity: sha512-vzLkVder21GpWRrmSR9JxGZ5+ibIUSudXlW52qeKpzUEQhRSmyZiVDDj3crAth7+5tmN1ulvgKaCU2f/bPRCzg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - - '@typescript-eslint/visitor-keys@6.7.3': - resolution: {integrity: sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==} - engines: {node: ^16.0.0 || >=18.0.0} + '@vitest/pretty-format@2.1.1': + resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==} - JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true + '@vitest/runner@2.1.1': + resolution: {integrity: sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==} - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@vitest/snapshot@2.1.1': + resolution: {integrity: sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==} - acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} + '@vitest/spy@2.1.1': + resolution: {integrity: sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==} - acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true + '@vitest/utils@2.1.1': + resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==} - acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} - engines: {node: '>=0.4.0'} + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} @@ -512,6 +626,10 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -520,8 +638,9 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -529,63 +648,39 @@ packages: array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - big-integer@1.6.51: - resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} - engines: {node: '>=0.6'} - - bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - bundle-name@3.0.0: - resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} - engines: {node: '>=12'} - - c8@8.0.1: - resolution: {integrity: sha512-EINpopxZNH1mETuI0DzRA4MZpAUH+IFiRhnmFD3vFr3vdrgxqi3VfE3KL0AIL+zDq8rC9bZqwM/VDmmoe04y7w==} - engines: {node: '>=12'} - hasBin: true - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} @@ -604,62 +699,53 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - conventional-changelog-angular@6.0.0: - resolution: {integrity: sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==} - engines: {node: '>=14'} + conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} - conventional-changelog-conventionalcommits@6.1.0: - resolution: {integrity: sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw==} - engines: {node: '>=14'} + conventional-changelog-conventionalcommits@7.0.2: + resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} + engines: {node: '>=16'} - conventional-commits-parser@4.0.0: - resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} - engines: {node: '>=14'} + conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} hasBin: true - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + cookie-signature@1.0.7: + resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} - cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - - cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} - cosmiconfig-typescript-loader@4.3.0: - resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} - engines: {node: '>=12', npm: '>=6'} + cosmiconfig-typescript-loader@5.0.0: + resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} + engines: {node: '>=v16'} peerDependencies: '@types/node': '*' - cosmiconfig: '>=7' - ts-node: '>=10' - typescript: '>=3' + cosmiconfig: '>=8.2' + typescript: '>=4' - cosmiconfig@8.1.0: - resolution: {integrity: sha512-0tLZ9URlPGU7JsKq0DQOQ3FoRsYX8xDZ7xMiATQfaiGMz7EHowNkbU9u1coAOmnh9p/1ySpm0RB3JNWRXM5GCg==} + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} - - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} - dargs@7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} + dargs@8.1.0: + resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} + engines: {node: '>=12'} debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} @@ -669,8 +755,8 @@ packages: supports-color: optional: true - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -678,209 +764,40 @@ packages: supports-color: optional: true - decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} - - default-browser@4.0.0: - resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} - engines: {node: '>=14.16'} - - define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - - diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-content-type@0.1.0: - resolution: {integrity: sha512-DqWU9pSzhNlO10q+NQ/KebImLkKbwbcy0pSv3hNQfEpKFHsrqDJz2vajpZdq7nkiG9DoJcTh22oHGymp7XJd9g==} - engines: {node: '>=12.x'} - es-escape-html@0.1.1: resolution: {integrity: sha512-yUx1o+8RsG7UlszmYPtks+dm6Lho2m8lgHMOsLJQsFI0R8XwUJwiMhM1M4E/S8QLeGyf6MkDV/pWgjQ0tdTSyQ==} engines: {node: '>=12.x'} - es-fresh@0.0.11: - resolution: {integrity: sha512-pMAgUE0jSWkCf4ua/gcweHdubuAS/wi3paHoBAPRwxfCK/R13oXq53yyN9XHewe0eIVqNlSN7FunxXySX2Q46Q==} - engines: {node: '>=12.x'} - - es-mime-types@0.1.4: - resolution: {integrity: sha512-rUrmfrUIHU/4ykYB+YH80LDiSpmn6sE/A9E8EsFZP4LCtf/PH+ju6d6goFJ8fsGf81pRtQn1cJSmp8JGA9YkfQ==} - engines: {node: '>=12.x'} - - es-vary@0.1.2: - resolution: {integrity: sha512-pLqqZoOutAXQXyBJrUYVNM5fZngiOJYi1Xl4svQMrluTsqDUOQlBMw9EYgLrsWL6niDYn/Yd1y2Pj6GC+j/yjA==} - engines: {node: '>=12.x'} - - esbuild-android-64@0.15.18: - resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - esbuild-android-arm64@0.15.18: - resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - esbuild-darwin-64@0.15.18: - resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - esbuild-darwin-arm64@0.15.18: - resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - esbuild-freebsd-64@0.15.18: - resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - esbuild-freebsd-arm64@0.15.18: - resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - esbuild-linux-32@0.15.18: - resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - esbuild-linux-64@0.15.18: - resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - esbuild-linux-arm64@0.15.18: - resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - esbuild-linux-arm@0.15.18: - resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - esbuild-linux-mips64le@0.15.18: - resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - esbuild-linux-ppc64le@0.15.18: - resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - esbuild-linux-riscv64@0.15.18: - resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - esbuild-linux-s390x@0.15.18: - resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - esbuild-netbsd-64@0.15.18: - resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - esbuild-openbsd-64@0.15.18: - resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - esbuild-sunos-64@0.15.18: - resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - esbuild-windows-32@0.15.18: - resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - esbuild-windows-64@0.15.18: - resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - esbuild-windows-arm64@0.15.18: - resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - esbuild@0.15.18: - resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true @@ -892,197 +809,48 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eslint-config-prettier@9.0.0: - resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-plugin-prettier@5.0.0: - resolution: {integrity: sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.3.0: - resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint@8.50.0: - resolution: {integrity: sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - - execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} - - express-session@1.17.3: - resolution: {integrity: sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==} + express-session@1.18.0: + resolution: {integrity: sha512-m93QLWr0ju+rOwApSsyso838LQwgfs44QtOP/WBiwtAgPIo/SAh1a5c6nn2BR6mFNZehTpqKDESzP+fRHVbxwQ==} engines: {node: '>= 0.8.0'} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-diff@1.2.0: - resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} - - fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - engines: {node: '>=8.6.0'} - - fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} - - flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - - foreground-child@2.0.0: - resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} - engines: {node: '>=8.0.0'} + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} - form-data@3.0.1: - resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} - engines: {node: '>= 6'} - - fs-extra@11.1.0: - resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} - engines: {node: '>=14.14'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} - fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - git-raw-commits@2.0.11: - resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} - engines: {node: '>=10'} + git-raw-commits@4.0.0: + resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} + engines: {node: '>=16'} hasBin: true - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - global-dirs@0.1.1: - resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} - engines: {node: '>=4'} - - globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} - engines: {node: '>=8'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - graceful-fs@4.2.10: - resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true - hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} @@ -1092,147 +860,74 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - header-range-parser@1.1.3: resolution: {integrity: sha512-B9zCFt3jH8g09LR1vHL4pcAn8yMEtlSlOUdQemzHMRKMImNIhhszdeosYFfNW0WXKQtXIlWB+O4owHJKvEJYaA==} engines: {node: '>=12.22.0'} - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - - hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - - human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - - husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} + husky@9.1.6: + resolution: {integrity: sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==} + engines: {node: '>=18'} hasBin: true - ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - - inflight@1.0.6: - resolution: {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. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - ipaddr.js@2.1.0: - resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} + ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} engines: {node: '>= 10'} is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-core-module@2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} - - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - is-obj@2.0.0: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - is-text-path@1.0.1: - resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} - engines: {node: '>=0.10.0'} - - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} engines: {node: '>=8'} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -1243,51 +938,23 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - lodash.isfunction@3.0.9: - resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} - lodash.isplainobject@4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} @@ -1312,160 +979,79 @@ packages: lodash.upperfirst@4.3.1: resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} - map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} - meow@8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - - milliparsec@2.3.0: - resolution: {integrity: sha512-b+6KYJw+DwQjk24qCUuq+lZvRXDpXJ02qsllKgKaDurHpQ0v7D5op9VAkdYM/pXRhFeh7uLYHmnwFnYvdXGa3A==} - engines: {node: '>=12.4'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} + meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} + milliparsec@4.0.0: + resolution: {integrity: sha512-/wk9d4Z6/9ZvoEH/6BI4TrTCgmkpZPuSRN/6fI9aUHOfXdNTuj/VhLS7d+NqG26bi6L9YmGXutVYvWC8zQ0qtA==} + engines: {node: '>=20'} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + mime@4.0.4: + resolution: {integrity: sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==} + engines: {node: '>=16'} + hasBin: true - minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} - node-fetch@2.6.9: - resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} - - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - - open@9.1.0: - resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} - engines: {node: '>=14.16'} - - optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} @@ -1479,82 +1065,42 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} - prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} - prettier@3.0.3: - resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} - engines: {node: '>=14'} - hasBin: true + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} + engines: {node: ^10 || ^12 || >=14} punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - random-bytes@1.0.0: resolution: {integrity: sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==} engines: {node: '>= 0.8'} - read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - - read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - - regexparam@2.0.1: - resolution: {integrity: sha512-zRgSaYemnNYxUv+/5SeoHI0eJIgTL/A2pUtXUPLHQxUldagouJ9p+K6IbIZ/JiQuCEv2E2B1O11SjVQy3aMCkw==} + regexparam@2.0.2: + resolution: {integrity: sha512-A1PeDEYMrkLrfyOwv2jwihXbo9qxdGD3atBYQA9JJgreAx8/7rC6IUkWOw2NQlOxLp2wL0ifQbh1HuidDfYA6w==} engines: {node: '>=8'} require-directory@2.1.1: @@ -1573,53 +1119,21 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve-global@1.0.0: - resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} - engines: {node: '>=8'} - - resolve@1.22.1: - resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} - hasBin: true - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported + rollup@4.21.3: + resolution: {integrity: sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rollup@3.29.4: - resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - - run-applescript@5.0.0: - resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} - engines: {node: '>=12'} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - semver@5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} - hasBin: true - - semver@7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} hasBin: true - semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true @@ -1631,57 +1145,46 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} - spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} - spdx-license-ids@3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - supertest-fetch@1.5.0: - resolution: {integrity: sha512-B4hy3WLbRQiRqoJR1eKN9E1MdZZeeeHe/ARAjYhwpP6i1XcZJI7Yt9jTYJO6Tj6o2/SvZbxsI05c3XheuTfR6w==} + supertest-fetch@2.0.0: + resolution: {integrity: sha512-Mx2ZszLJkrBMFt7fmyML12y+u2yHAN5FF94yOzZXHzrTtsS59fjdbqh9G4OAPDM14jnkDkcLk2AgCVGJZcVoUg==} + engines: {node: '>=18.0.0'} supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} @@ -1691,96 +1194,41 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} - synckit@0.8.5: - resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} - engines: {node: ^14.18.0 || >=16.0.0} - - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} engines: {node: '>=8'} - text-extensions@1.9.0: - resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} - engines: {node: '>=0.10'} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} - through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - titleize@3.0.0: - resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} - engines: {node: '>=12'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - - ts-api-utils@1.0.3: - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' - - ts-node@10.9.1: - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - tsm@2.3.0: - resolution: {integrity: sha512-++0HFnmmR+gMpDtKTnW3XJ4yv9kVGi20n+NfyQWB9qwJvTaIWY9kBmzek2YUQK5APTQ/1DTrXmm4QtFPmW9Rzw==} - engines: {node: '>=12'} - hasBin: true + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + tinyexec@0.3.0: + resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} - type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} + tinypool@1.0.1: + resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} + engines: {node: ^18.0.0 || >=20.0.0} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} - type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} - typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + typescript@5.6.2: + resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} engines: {node: '>=14.17'} hasBin: true @@ -1788,52 +1236,94 @@ packages: resolution: {integrity: sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==} engines: {node: '>= 0.8'} - universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} + vite-node@2.1.1: + resolution: {integrity: sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - - v8-to-istanbul@9.1.0: - resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} - engines: {node: '>=10.12.0'} - - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + vite@5.4.5: + resolution: {integrity: sha512-pXqR0qtb2bTwLkev4SE3r4abCNioP3GkjvIDLlzziPpXtHgiJIjuKl+1GN6ESOT3wMjG3JTeARopj2SwYaHTOA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + vitest@2.1.1: + resolution: {integrity: sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.1 + '@vitest/ui': 2.1.1 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} @@ -1842,1192 +1332,832 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs@17.7.1: - resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} - engines: {node: '>=12'} - yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} snapshots: - '@aashutoshrathi/word-wrap@1.2.6': {} + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 '@babel/code-frame@7.18.6': dependencies: '@babel/highlight': 7.18.6 - '@babel/helper-validator-identifier@7.19.1': {} + '@babel/helper-string-parser@7.24.8': {} + + '@babel/helper-validator-identifier@7.24.7': {} '@babel/highlight@7.18.6': dependencies: - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 + '@babel/parser@7.25.6': + dependencies: + '@babel/types': 7.25.6 + + '@babel/types@7.25.6': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + '@bcoe/v8-coverage@0.2.3': {} - '@commitlint/cli@17.7.2': + '@biomejs/biome@1.9.1': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.9.1 + '@biomejs/cli-darwin-x64': 1.9.1 + '@biomejs/cli-linux-arm64': 1.9.1 + '@biomejs/cli-linux-arm64-musl': 1.9.1 + '@biomejs/cli-linux-x64': 1.9.1 + '@biomejs/cli-linux-x64-musl': 1.9.1 + '@biomejs/cli-win32-arm64': 1.9.1 + '@biomejs/cli-win32-x64': 1.9.1 + + '@biomejs/cli-darwin-arm64@1.9.1': + optional: true + + '@biomejs/cli-darwin-x64@1.9.1': + optional: true + + '@biomejs/cli-linux-arm64-musl@1.9.1': + optional: true + + '@biomejs/cli-linux-arm64@1.9.1': + optional: true + + '@biomejs/cli-linux-x64-musl@1.9.1': + optional: true + + '@biomejs/cli-linux-x64@1.9.1': + optional: true + + '@biomejs/cli-win32-arm64@1.9.1': + optional: true + + '@biomejs/cli-win32-x64@1.9.1': + optional: true + + '@commitlint/cli@19.5.0(@types/node@22.5.5)(typescript@5.6.2)': dependencies: - '@commitlint/format': 17.4.4 - '@commitlint/lint': 17.7.0 - '@commitlint/load': 17.7.2 - '@commitlint/read': 17.5.1 - '@commitlint/types': 17.4.4 - execa: 5.1.1 - lodash.isfunction: 3.0.9 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - yargs: 17.7.1 + '@commitlint/format': 19.5.0 + '@commitlint/lint': 19.5.0 + '@commitlint/load': 19.5.0(@types/node@22.5.5)(typescript@5.6.2) + '@commitlint/read': 19.5.0 + '@commitlint/types': 19.5.0 + tinyexec: 0.3.0 + yargs: 17.7.2 transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' + - '@types/node' + - typescript - '@commitlint/config-conventional@17.7.0': + '@commitlint/config-conventional@19.5.0': dependencies: - conventional-changelog-conventionalcommits: 6.1.0 + '@commitlint/types': 19.5.0 + conventional-changelog-conventionalcommits: 7.0.2 - '@commitlint/config-validator@17.6.7': + '@commitlint/config-validator@19.5.0': dependencies: - '@commitlint/types': 17.4.4 + '@commitlint/types': 19.5.0 ajv: 8.12.0 - '@commitlint/ensure@17.6.7': + '@commitlint/ensure@19.5.0': dependencies: - '@commitlint/types': 17.4.4 + '@commitlint/types': 19.5.0 lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 lodash.snakecase: 4.1.1 lodash.startcase: 4.4.0 lodash.upperfirst: 4.3.1 - '@commitlint/execute-rule@17.4.0': {} + '@commitlint/execute-rule@19.5.0': {} - '@commitlint/format@17.4.4': + '@commitlint/format@19.5.0': dependencies: - '@commitlint/types': 17.4.4 - chalk: 4.1.2 + '@commitlint/types': 19.5.0 + chalk: 5.3.0 - '@commitlint/is-ignored@17.7.0': + '@commitlint/is-ignored@19.5.0': dependencies: - '@commitlint/types': 17.4.4 - semver: 7.5.4 + '@commitlint/types': 19.5.0 + semver: 7.6.3 - '@commitlint/lint@17.7.0': + '@commitlint/lint@19.5.0': dependencies: - '@commitlint/is-ignored': 17.7.0 - '@commitlint/parse': 17.7.0 - '@commitlint/rules': 17.7.0 - '@commitlint/types': 17.4.4 + '@commitlint/is-ignored': 19.5.0 + '@commitlint/parse': 19.5.0 + '@commitlint/rules': 19.5.0 + '@commitlint/types': 19.5.0 - '@commitlint/load@17.7.2': + '@commitlint/load@19.5.0(@types/node@22.5.5)(typescript@5.6.2)': dependencies: - '@commitlint/config-validator': 17.6.7 - '@commitlint/execute-rule': 17.4.0 - '@commitlint/resolve-extends': 17.6.7 - '@commitlint/types': 17.4.4 - '@types/node': 20.5.1 - chalk: 4.1.2 - cosmiconfig: 8.1.0 - cosmiconfig-typescript-loader: 4.3.0(@types/node@20.5.1)(cosmiconfig@8.1.0)(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.2.2))(typescript@5.2.2) + '@commitlint/config-validator': 19.5.0 + '@commitlint/execute-rule': 19.5.0 + '@commitlint/resolve-extends': 19.5.0 + '@commitlint/types': 19.5.0 + chalk: 5.3.0 + cosmiconfig: 9.0.0(typescript@5.6.2) + cosmiconfig-typescript-loader: 5.0.0(@types/node@22.5.5)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 - resolve-from: 5.0.0 - ts-node: 10.9.1(@types/node@20.5.1)(typescript@5.2.2) - typescript: 5.2.2 transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' + - '@types/node' + - typescript - '@commitlint/message@17.4.2': {} + '@commitlint/message@19.5.0': {} - '@commitlint/parse@17.7.0': + '@commitlint/parse@19.5.0': dependencies: - '@commitlint/types': 17.4.4 - conventional-changelog-angular: 6.0.0 - conventional-commits-parser: 4.0.0 + '@commitlint/types': 19.5.0 + conventional-changelog-angular: 7.0.0 + conventional-commits-parser: 5.0.0 - '@commitlint/read@17.5.1': + '@commitlint/read@19.5.0': dependencies: - '@commitlint/top-level': 17.4.0 - '@commitlint/types': 17.4.4 - fs-extra: 11.1.0 - git-raw-commits: 2.0.11 + '@commitlint/top-level': 19.5.0 + '@commitlint/types': 19.5.0 + git-raw-commits: 4.0.0 minimist: 1.2.8 + tinyexec: 0.3.0 - '@commitlint/resolve-extends@17.6.7': + '@commitlint/resolve-extends@19.5.0': dependencies: - '@commitlint/config-validator': 17.6.7 - '@commitlint/types': 17.4.4 - import-fresh: 3.3.0 + '@commitlint/config-validator': 19.5.0 + '@commitlint/types': 19.5.0 + global-directory: 4.0.1 + import-meta-resolve: 4.1.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 - resolve-global: 1.0.0 - '@commitlint/rules@17.7.0': + '@commitlint/rules@19.5.0': dependencies: - '@commitlint/ensure': 17.6.7 - '@commitlint/message': 17.4.2 - '@commitlint/to-lines': 17.4.0 - '@commitlint/types': 17.4.4 - execa: 5.1.1 + '@commitlint/ensure': 19.5.0 + '@commitlint/message': 19.5.0 + '@commitlint/to-lines': 19.5.0 + '@commitlint/types': 19.5.0 - '@commitlint/to-lines@17.4.0': {} + '@commitlint/to-lines@19.5.0': {} - '@commitlint/top-level@17.4.0': + '@commitlint/top-level@19.5.0': dependencies: - find-up: 5.0.0 + find-up: 7.0.0 - '@commitlint/types@17.4.4': + '@commitlint/types@19.5.0': dependencies: - chalk: 4.1.2 + '@types/conventional-commits-parser': 5.0.0 + chalk: 5.3.0 - '@cspotcode/source-map-support@0.8.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.9 + '@esbuild/aix-ppc64@0.21.5': + optional: true - '@esbuild/android-arm@0.15.18': + '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/linux-loong64@0.15.18': + '@esbuild/android-arm@0.21.5': optional: true - '@eslint-community/eslint-utils@4.2.0(eslint@8.50.0)': - dependencies: - eslint: 8.50.0 - eslint-visitor-keys: 3.4.3 + '@esbuild/android-x64@0.21.5': + optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.50.0)': - dependencies: - eslint: 8.50.0 - eslint-visitor-keys: 3.3.0 + '@esbuild/darwin-arm64@0.21.5': + optional: true - '@eslint-community/regexpp@4.9.0': {} + '@esbuild/darwin-x64@0.21.5': + optional: true - '@eslint/eslintrc@2.1.2': - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.20.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + '@esbuild/freebsd-arm64@0.21.5': + optional: true - '@eslint/js@8.50.0': {} + '@esbuild/freebsd-x64@0.21.5': + optional: true - '@humanwhocodes/config-array@0.11.11': - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + '@esbuild/linux-arm64@0.21.5': + optional: true - '@humanwhocodes/module-importer@1.0.1': {} + '@esbuild/linux-arm@0.21.5': + optional: true - '@humanwhocodes/object-schema@1.2.1': {} + '@esbuild/linux-ia32@0.21.5': + optional: true - '@istanbuljs/schema@0.1.3': {} + '@esbuild/linux-loong64@0.21.5': + optional: true - '@jridgewell/resolve-uri@3.1.0': {} + '@esbuild/linux-mips64el@0.21.5': + optional: true - '@jridgewell/sourcemap-codec@1.4.14': {} + '@esbuild/linux-ppc64@0.21.5': + optional: true - '@jridgewell/trace-mapping@0.3.17': - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 + '@esbuild/linux-riscv64@0.21.5': + optional: true - '@jridgewell/trace-mapping@0.3.9': - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 + '@esbuild/linux-s390x@0.21.5': + optional: true - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + '@esbuild/linux-x64@0.21.5': + optional: true - '@nodelib/fs.stat@2.0.5': {} + '@esbuild/netbsd-x64@0.21.5': + optional: true - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 + '@esbuild/openbsd-x64@0.21.5': + optional: true - '@pkgr/utils@2.4.2': - dependencies: - cross-spawn: 7.0.3 - fast-glob: 3.3.1 - is-glob: 4.0.3 - open: 9.1.0 - picocolors: 1.0.0 - tslib: 2.6.2 + '@esbuild/sunos-x64@0.21.5': + optional: true - '@rollup/plugin-typescript@11.1.4(rollup@3.29.4)(tslib@2.6.2)(typescript@5.2.2)': - dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.29.4) - resolve: 1.22.1 - typescript: 5.2.2 - optionalDependencies: - rollup: 3.29.4 - tslib: 2.6.2 + '@esbuild/win32-arm64@0.21.5': + optional: true - '@rollup/pluginutils@5.0.2(rollup@3.29.4)': - dependencies: - '@types/estree': 1.0.0 - estree-walker: 2.0.2 - picomatch: 2.3.1 - optionalDependencies: - rollup: 3.29.4 + '@esbuild/win32-ia32@0.21.5': + optional: true - '@tinyhttp/accepts@2.0.8': - dependencies: - es-mime-types: 0.1.4 - negotiator: 0.6.3 + '@esbuild/win32-x64@0.21.5': + optional: true - '@tinyhttp/app@2.0.32': + '@isaacs/cliui@8.0.2': dependencies: - '@tinyhttp/cookie': 2.0.6 - '@tinyhttp/proxy-addr': 2.0.7 - '@tinyhttp/req': 2.0.16 - '@tinyhttp/res': 2.0.23 - '@tinyhttp/router': 2.1.0 - header-range-parser: 1.1.3 - regexparam: 2.0.1 + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 - '@tinyhttp/content-disposition@2.0.9': {} + '@istanbuljs/schema@0.1.3': {} - '@tinyhttp/cookie-parser@2.0.6': + '@jridgewell/gen-mapping@0.3.5': dependencies: - '@tinyhttp/cookie': 2.1.0 - '@tinyhttp/cookie-signature': 2.1.0 + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.25 - '@tinyhttp/cookie-signature@2.0.6': {} + '@jridgewell/resolve-uri@3.1.0': {} - '@tinyhttp/cookie-signature@2.1.0': {} + '@jridgewell/set-array@1.2.1': {} - '@tinyhttp/cookie@2.0.6': {} + '@jridgewell/sourcemap-codec@1.4.14': {} - '@tinyhttp/cookie@2.1.0': {} + '@jridgewell/sourcemap-codec@1.5.0': {} - '@tinyhttp/encode-url@2.0.7': {} + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 - '@tinyhttp/etag@2.0.6': {} + '@pkgjs/parseargs@0.11.0': + optional: true - '@tinyhttp/forwarded@2.0.6': {} + '@rollup/rollup-android-arm-eabi@4.21.3': + optional: true - '@tinyhttp/proxy-addr@2.0.7': - dependencies: - '@tinyhttp/forwarded': 2.0.6 - ipaddr.js: 2.1.0 + '@rollup/rollup-android-arm64@4.21.3': + optional: true - '@tinyhttp/req@2.0.16': - dependencies: - '@tinyhttp/accepts': 2.0.8 - '@tinyhttp/type-is': 2.0.7 - '@tinyhttp/url': 2.0.8 - es-fresh: 0.0.11 - header-range-parser: 1.1.3 + '@rollup/rollup-darwin-arm64@4.21.3': + optional: true - '@tinyhttp/res@2.0.23': - dependencies: - '@tinyhttp/content-disposition': 2.0.9 - '@tinyhttp/cookie': 2.0.6 - '@tinyhttp/cookie-signature': 2.0.6 - '@tinyhttp/encode-url': 2.0.7 - '@tinyhttp/req': 2.0.16 - '@tinyhttp/send': 2.0.8 - es-escape-html: 0.1.1 - es-mime-types: 0.1.4 - es-vary: 0.1.2 + '@rollup/rollup-darwin-x64@4.21.3': + optional: true - '@tinyhttp/router@2.1.0': {} + '@rollup/rollup-linux-arm-gnueabihf@4.21.3': + optional: true - '@tinyhttp/send@2.0.8': - dependencies: - '@tinyhttp/etag': 2.0.6 - es-content-type: 0.1.0 - es-mime-types: 0.1.4 + '@rollup/rollup-linux-arm-musleabihf@4.21.3': + optional: true - '@tinyhttp/type-is@2.0.7': - dependencies: - es-content-type: 0.1.0 - es-mime-types: 0.1.4 + '@rollup/rollup-linux-arm64-gnu@4.21.3': + optional: true - '@tinyhttp/url@2.0.8': {} + '@rollup/rollup-linux-arm64-musl@4.21.3': + optional: true - '@tsconfig/node10@1.0.9': {} + '@rollup/rollup-linux-powerpc64le-gnu@4.21.3': + optional: true - '@tsconfig/node12@1.0.11': {} + '@rollup/rollup-linux-riscv64-gnu@4.21.3': + optional: true - '@tsconfig/node14@1.0.3': {} + '@rollup/rollup-linux-s390x-gnu@4.21.3': + optional: true - '@tsconfig/node16@1.0.3': {} + '@rollup/rollup-linux-x64-gnu@4.21.3': + optional: true - '@types/body-parser@1.19.2': - dependencies: - '@types/connect': 3.4.35 - '@types/node': 20.8.0 - - '@types/connect@3.4.35': - dependencies: - '@types/node': 20.8.0 - - '@types/estree@1.0.0': {} - - '@types/express-serve-static-core@4.17.33': - dependencies: - '@types/node': 20.8.0 - '@types/qs': 6.9.7 - '@types/range-parser': 1.2.4 - - '@types/express-session@1.17.8': - dependencies: - '@types/express': 4.17.17 - - '@types/express@4.17.17': - dependencies: - '@types/body-parser': 1.19.2 - '@types/express-serve-static-core': 4.17.33 - '@types/qs': 6.9.7 - '@types/serve-static': 1.15.1 - - '@types/istanbul-lib-coverage@2.0.4': {} - - '@types/json-schema@7.0.13': {} - - '@types/mime@3.0.1': {} - - '@types/minimist@1.2.2': {} - - '@types/node-fetch@2.6.2': - dependencies: - '@types/node': 20.8.0 - form-data: 3.0.1 - - '@types/node@20.5.1': {} - - '@types/node@20.8.0': {} - - '@types/normalize-package-data@2.4.1': {} - - '@types/qs@6.9.7': {} - - '@types/range-parser@1.2.4': {} - - '@types/semver@7.5.3': {} - - '@types/serve-static@1.15.1': - dependencies: - '@types/mime': 3.0.1 - '@types/node': 20.8.0 - - '@typescript-eslint/eslint-plugin@6.7.3(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0)(typescript@5.2.2)': - dependencies: - '@eslint-community/regexpp': 4.9.0 - '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 6.7.3 - '@typescript-eslint/type-utils': 6.7.3(eslint@8.50.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.7.3(eslint@8.50.0)(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.7.3 - debug: 4.3.4 - eslint: 8.50.0 - graphemer: 1.4.0 - ignore: 5.2.4 - natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - optionalDependencies: - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2)': - dependencies: - '@typescript-eslint/scope-manager': 6.7.3 - '@typescript-eslint/types': 6.7.3 - '@typescript-eslint/typescript-estree': 6.7.3(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.7.3 - debug: 4.3.4 - eslint: 8.50.0 - optionalDependencies: - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@6.7.3': - dependencies: - '@typescript-eslint/types': 6.7.3 - '@typescript-eslint/visitor-keys': 6.7.3 - - '@typescript-eslint/type-utils@6.7.3(eslint@8.50.0)(typescript@5.2.2)': - dependencies: - '@typescript-eslint/typescript-estree': 6.7.3(typescript@5.2.2) - '@typescript-eslint/utils': 6.7.3(eslint@8.50.0)(typescript@5.2.2) - debug: 4.3.4 - eslint: 8.50.0 - ts-api-utils: 1.0.3(typescript@5.2.2) - optionalDependencies: - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@6.7.3': {} - - '@typescript-eslint/typescript-estree@6.7.3(typescript@5.2.2)': - dependencies: - '@typescript-eslint/types': 6.7.3 - '@typescript-eslint/visitor-keys': 6.7.3 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - optionalDependencies: - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@6.7.3(eslint@8.50.0)(typescript@5.2.2)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) - '@types/json-schema': 7.0.13 - '@types/semver': 7.5.3 - '@typescript-eslint/scope-manager': 6.7.3 - '@typescript-eslint/types': 6.7.3 - '@typescript-eslint/typescript-estree': 6.7.3(typescript@5.2.2) - eslint: 8.50.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/visitor-keys@6.7.3': - dependencies: - '@typescript-eslint/types': 6.7.3 - eslint-visitor-keys: 3.4.3 - - JSONStream@1.3.5: - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - - acorn-jsx@5.3.2(acorn@8.10.0): - dependencies: - acorn: 8.10.0 - - acorn-walk@8.2.0: {} - - acorn@8.10.0: {} - - acorn@8.8.2: {} + '@rollup/rollup-linux-x64-musl@4.21.3': + optional: true - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 + '@rollup/rollup-win32-arm64-msvc@4.21.3': + optional: true - ajv@8.12.0: - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 + '@rollup/rollup-win32-ia32-msvc@4.21.3': + optional: true - ansi-regex@5.0.1: {} + '@rollup/rollup-win32-x64-msvc@4.21.3': + optional: true - ansi-styles@3.2.1: + '@tinyhttp/accepts@2.2.3': dependencies: - color-convert: 1.9.3 + mime: 4.0.4 + negotiator: 0.6.3 - ansi-styles@4.3.0: + '@tinyhttp/app@2.4.0': dependencies: - color-convert: 2.0.1 - - arg@4.1.3: {} - - argparse@2.0.1: {} - - array-ify@1.0.0: {} - - array-union@2.1.0: {} - - arrify@1.0.1: {} - - asynckit@0.4.0: {} + '@tinyhttp/cookie': 2.1.1 + '@tinyhttp/proxy-addr': 2.2.0 + '@tinyhttp/req': 2.2.4 + '@tinyhttp/res': 2.2.4 + '@tinyhttp/router': 2.2.3 + header-range-parser: 1.1.3 + regexparam: 2.0.2 - balanced-match@1.0.2: {} + '@tinyhttp/content-disposition@2.2.2': {} - big-integer@1.6.51: {} + '@tinyhttp/content-type@0.1.4': {} - bplist-parser@0.2.0: + '@tinyhttp/cookie-parser@2.0.6': dependencies: - big-integer: 1.6.51 + '@tinyhttp/cookie': 2.1.1 + '@tinyhttp/cookie-signature': 2.1.1 - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 + '@tinyhttp/cookie-signature@2.1.1': {} - braces@3.0.3: - dependencies: - fill-range: 7.1.1 + '@tinyhttp/cookie@2.1.1': {} - bundle-name@3.0.0: - dependencies: - run-applescript: 5.0.0 + '@tinyhttp/encode-url@2.1.1': {} - c8@8.0.1: - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@istanbuljs/schema': 0.1.3 - find-up: 5.0.0 - foreground-child: 2.0.0 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-report: 3.0.1 - istanbul-reports: 3.1.6 - rimraf: 3.0.2 - test-exclude: 6.0.0 - v8-to-istanbul: 9.1.0 - yargs: 17.7.2 - yargs-parser: 21.1.1 + '@tinyhttp/etag@2.1.2': {} - callsites@3.1.0: {} + '@tinyhttp/forwarded@2.1.1': {} - camelcase-keys@6.2.2: + '@tinyhttp/proxy-addr@2.2.0': dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - - camelcase@5.3.1: {} + '@tinyhttp/forwarded': 2.1.1 + ipaddr.js: 2.2.0 - chalk@2.4.2: + '@tinyhttp/req@2.2.4': dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 + '@tinyhttp/accepts': 2.2.3 + '@tinyhttp/type-is': 2.2.4 + '@tinyhttp/url': 2.1.1 + header-range-parser: 1.1.3 - chalk@4.1.2: + '@tinyhttp/res@2.2.4': dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 + '@tinyhttp/content-disposition': 2.2.2 + '@tinyhttp/cookie': 2.1.1 + '@tinyhttp/cookie-signature': 2.1.1 + '@tinyhttp/encode-url': 2.1.1 + '@tinyhttp/req': 2.2.4 + '@tinyhttp/send': 2.2.3 + '@tinyhttp/vary': 0.1.3 + es-escape-html: 0.1.1 + mime: 4.0.4 - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 + '@tinyhttp/router@2.2.3': {} - color-convert@1.9.3: + '@tinyhttp/send@2.2.3': dependencies: - color-name: 1.1.3 + '@tinyhttp/content-type': 0.1.4 + '@tinyhttp/etag': 2.1.2 + mime: 4.0.4 - color-convert@2.0.1: + '@tinyhttp/type-is@2.2.4': dependencies: - color-name: 1.1.4 + '@tinyhttp/content-type': 0.1.4 + mime: 4.0.4 - color-name@1.1.3: {} + '@tinyhttp/url@2.1.1': {} - color-name@1.1.4: {} + '@tinyhttp/vary@0.1.3': {} - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - compare-func@2.0.0: - dependencies: - array-ify: 1.0.0 - dot-prop: 5.3.0 - - concat-map@0.0.1: {} - - conventional-changelog-angular@6.0.0: - dependencies: - compare-func: 2.0.0 - - conventional-changelog-conventionalcommits@6.1.0: - dependencies: - compare-func: 2.0.0 - - conventional-commits-parser@4.0.0: + '@types/body-parser@1.19.2': dependencies: - JSONStream: 1.3.5 - is-text-path: 1.0.1 - meow: 8.1.2 - split2: 3.2.2 - - convert-source-map@1.9.0: {} - - cookie-signature@1.0.6: {} - - cookie@0.4.2: {} + '@types/connect': 3.4.35 + '@types/node': 22.5.5 - cosmiconfig-typescript-loader@4.3.0(@types/node@20.5.1)(cosmiconfig@8.1.0)(ts-node@10.9.1(@types/node@20.8.0)(typescript@5.2.2))(typescript@5.2.2): + '@types/connect@3.4.35': dependencies: - '@types/node': 20.5.1 - cosmiconfig: 8.1.0 - ts-node: 10.9.1(@types/node@20.5.1)(typescript@5.2.2) - typescript: 5.2.2 + '@types/node': 22.5.5 - cosmiconfig@8.1.0: + '@types/conventional-commits-parser@5.0.0': dependencies: - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 + '@types/node': 22.5.5 - create-require@1.1.1: {} - - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 + '@types/estree@1.0.0': {} - dargs@7.0.0: {} + '@types/estree@1.0.5': {} - debug@2.6.9: + '@types/express-serve-static-core@4.17.33': dependencies: - ms: 2.0.0 + '@types/node': 22.5.5 + '@types/qs': 6.9.7 + '@types/range-parser': 1.2.4 - debug@4.3.4: + '@types/express-session@1.18.0': dependencies: - ms: 2.1.2 + '@types/express': 4.17.17 - decamelize-keys@1.1.1: + '@types/express@4.17.17': dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - - decamelize@1.2.0: {} - - deep-is@0.1.4: {} + '@types/body-parser': 1.19.2 + '@types/express-serve-static-core': 4.17.33 + '@types/qs': 6.9.7 + '@types/serve-static': 1.15.1 - default-browser-id@3.0.0: - dependencies: - bplist-parser: 0.2.0 - untildify: 4.0.0 + '@types/mime@3.0.1': {} - default-browser@4.0.0: + '@types/node@22.5.5': dependencies: - bundle-name: 3.0.0 - default-browser-id: 3.0.0 - execa: 7.2.0 - titleize: 3.0.0 - - define-lazy-prop@3.0.0: {} - - delayed-stream@1.0.0: {} - - depd@2.0.0: {} - - dequal@2.0.3: {} - - diff@4.0.2: {} + undici-types: 6.19.8 - diff@5.1.0: {} + '@types/qs@6.9.7': {} - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 + '@types/range-parser@1.2.4': {} - doctrine@3.0.0: + '@types/serve-static@1.15.1': dependencies: - esutils: 2.0.3 + '@types/mime': 3.0.1 + '@types/node': 22.5.5 - dot-prop@5.3.0: + '@vitest/coverage-v8@2.1.1(vitest@2.1.1(@types/node@22.5.5))': dependencies: - is-obj: 2.0.0 - - emoji-regex@8.0.0: {} + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.3.7 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.11 + magicast: 0.3.5 + std-env: 3.7.0 + test-exclude: 7.0.1 + tinyrainbow: 1.2.0 + vitest: 2.1.1(@types/node@22.5.5) + transitivePeerDependencies: + - supports-color - error-ex@1.3.2: + '@vitest/expect@2.1.1': dependencies: - is-arrayish: 0.2.1 - - es-content-type@0.1.0: {} - - es-escape-html@0.1.1: {} + '@vitest/spy': 2.1.1 + '@vitest/utils': 2.1.1 + chai: 5.1.1 + tinyrainbow: 1.2.0 - es-fresh@0.0.11: {} - - es-mime-types@0.1.4: + '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.5(@types/node@22.5.5))': dependencies: - mime-db: 1.52.0 - - es-vary@0.1.2: {} - - esbuild-android-64@0.15.18: - optional: true - - esbuild-android-arm64@0.15.18: - optional: true - - esbuild-darwin-64@0.15.18: - optional: true - - esbuild-darwin-arm64@0.15.18: - optional: true - - esbuild-freebsd-64@0.15.18: - optional: true - - esbuild-freebsd-arm64@0.15.18: - optional: true - - esbuild-linux-32@0.15.18: - optional: true - - esbuild-linux-64@0.15.18: - optional: true - - esbuild-linux-arm64@0.15.18: - optional: true - - esbuild-linux-arm@0.15.18: - optional: true - - esbuild-linux-mips64le@0.15.18: - optional: true - - esbuild-linux-ppc64le@0.15.18: - optional: true - - esbuild-linux-riscv64@0.15.18: - optional: true - - esbuild-linux-s390x@0.15.18: - optional: true - - esbuild-netbsd-64@0.15.18: - optional: true - - esbuild-openbsd-64@0.15.18: - optional: true - - esbuild-sunos-64@0.15.18: - optional: true - - esbuild-windows-32@0.15.18: - optional: true - - esbuild-windows-64@0.15.18: - optional: true - - esbuild-windows-arm64@0.15.18: - optional: true - - esbuild@0.15.18: + '@vitest/spy': 2.1.1 + estree-walker: 3.0.3 + magic-string: 0.30.11 optionalDependencies: - '@esbuild/android-arm': 0.15.18 - '@esbuild/linux-loong64': 0.15.18 - esbuild-android-64: 0.15.18 - esbuild-android-arm64: 0.15.18 - esbuild-darwin-64: 0.15.18 - esbuild-darwin-arm64: 0.15.18 - esbuild-freebsd-64: 0.15.18 - esbuild-freebsd-arm64: 0.15.18 - esbuild-linux-32: 0.15.18 - esbuild-linux-64: 0.15.18 - esbuild-linux-arm: 0.15.18 - esbuild-linux-arm64: 0.15.18 - esbuild-linux-mips64le: 0.15.18 - esbuild-linux-ppc64le: 0.15.18 - esbuild-linux-riscv64: 0.15.18 - esbuild-linux-s390x: 0.15.18 - esbuild-netbsd-64: 0.15.18 - esbuild-openbsd-64: 0.15.18 - esbuild-sunos-64: 0.15.18 - esbuild-windows-32: 0.15.18 - esbuild-windows-64: 0.15.18 - esbuild-windows-arm64: 0.15.18 - - escalade@3.1.1: {} - - escape-string-regexp@1.0.5: {} - - escape-string-regexp@4.0.0: {} + vite: 5.4.5(@types/node@22.5.5) - eslint-config-prettier@9.0.0(eslint@8.50.0): + '@vitest/pretty-format@2.1.1': dependencies: - eslint: 8.50.0 + tinyrainbow: 1.2.0 - eslint-plugin-prettier@5.0.0(eslint-config-prettier@9.0.0(eslint@8.50.0))(eslint@8.50.0)(prettier@3.0.3): + '@vitest/runner@2.1.1': dependencies: - eslint: 8.50.0 - prettier: 3.0.3 - prettier-linter-helpers: 1.0.0 - synckit: 0.8.5 - optionalDependencies: - eslint-config-prettier: 9.0.0(eslint@8.50.0) + '@vitest/utils': 2.1.1 + pathe: 1.1.2 - eslint-scope@7.2.2: + '@vitest/snapshot@2.1.1': dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.3.0: {} - - eslint-visitor-keys@3.4.3: {} + '@vitest/pretty-format': 2.1.1 + magic-string: 0.30.11 + pathe: 1.1.2 - eslint@8.50.0: + '@vitest/spy@2.1.1': dependencies: - '@eslint-community/eslint-utils': 4.2.0(eslint@8.50.0) - '@eslint-community/regexpp': 4.9.0 - '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.50.0 - '@humanwhocodes/config-array': 0.11.11 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - 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.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.20.0 - graphemer: 1.4.0 - ignore: 5.2.4 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - 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 - transitivePeerDependencies: - - supports-color + tinyspy: 3.0.2 - espree@9.6.1: + '@vitest/utils@2.1.1': dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.3 + '@vitest/pretty-format': 2.1.1 + loupe: 3.1.1 + tinyrainbow: 1.2.0 - esquery@1.5.0: + JSONStream@1.3.5: dependencies: - estraverse: 5.3.0 + jsonparse: 1.3.1 + through: 2.3.8 - esrecurse@4.3.0: + ajv@8.12.0: dependencies: - estraverse: 5.3.0 - - estraverse@5.3.0: {} + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 - estree-walker@2.0.2: {} + ansi-regex@5.0.1: {} - esutils@2.0.3: {} + ansi-regex@6.1.0: {} - execa@5.1.1: + ansi-styles@3.2.1: dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 + color-convert: 1.9.3 - execa@7.2.0: + ansi-styles@4.3.0: dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 4.3.1 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.1.0 - onetime: 6.0.0 - signal-exit: 3.0.7 - strip-final-newline: 3.0.0 - - express-session@1.17.3: - dependencies: - cookie: 0.4.2 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - on-headers: 1.0.2 - parseurl: 1.3.3 - safe-buffer: 5.2.1 - uid-safe: 2.1.5 - transitivePeerDependencies: - - supports-color - - fast-deep-equal@3.1.3: {} + color-convert: 2.0.1 - fast-diff@1.2.0: {} + ansi-styles@6.2.1: {} - fast-glob@3.2.12: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 + argparse@2.0.1: {} - fast-glob@3.3.1: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 + array-ify@1.0.0: {} - fast-json-stable-stringify@2.1.0: {} + assertion-error@2.0.1: {} - fast-levenshtein@2.0.6: {} + balanced-match@1.0.2: {} - fastq@1.15.0: + brace-expansion@2.0.1: dependencies: - reusify: 1.0.4 + balanced-match: 1.0.2 - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.0.4 + cac@6.7.14: {} - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 + callsites@3.1.0: {} - find-up@4.1.0: + chai@5.1.1: dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 - find-up@5.0.0: + chalk@2.4.2: dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 - flat-cache@3.0.4: - dependencies: - flatted: 3.2.7 - rimraf: 3.0.2 + chalk@5.3.0: {} - flatted@3.2.7: {} + check-error@2.1.1: {} - foreground-child@2.0.0: + cliui@8.0.1: dependencies: - cross-spawn: 7.0.3 - signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 - form-data@3.0.1: + color-convert@1.9.3: dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 + color-name: 1.1.3 - fs-extra@11.1.0: + color-convert@2.0.1: dependencies: - graceful-fs: 4.2.10 - jsonfile: 6.1.0 - universalify: 2.0.0 - - fs.realpath@1.0.0: {} - - fsevents@2.3.2: - optional: true - - function-bind@1.1.1: {} + color-name: 1.1.4 - get-caller-file@2.0.5: {} + color-name@1.1.3: {} - get-stream@6.0.1: {} + color-name@1.1.4: {} - git-raw-commits@2.0.11: + compare-func@2.0.0: dependencies: - dargs: 7.0.0 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 + array-ify: 1.0.0 + dot-prop: 5.3.0 - glob-parent@5.1.2: + conventional-changelog-angular@7.0.0: dependencies: - is-glob: 4.0.3 + compare-func: 2.0.0 - glob-parent@6.0.2: + conventional-changelog-conventionalcommits@7.0.2: dependencies: - is-glob: 4.0.3 + compare-func: 2.0.0 - glob@7.2.3: + conventional-commits-parser@5.0.0: dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 + JSONStream: 1.3.5 + is-text-path: 2.0.0 + meow: 12.1.1 + split2: 4.2.0 + + cookie-signature@1.0.7: {} - global-dirs@0.1.1: + cookie@0.6.0: {} + + cosmiconfig-typescript-loader@5.0.0(@types/node@22.5.5)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2): dependencies: - ini: 1.3.8 + '@types/node': 22.5.5 + cosmiconfig: 9.0.0(typescript@5.6.2) + jiti: 1.21.6 + typescript: 5.6.2 - globals@13.20.0: + cosmiconfig@9.0.0(typescript@5.6.2): dependencies: - type-fest: 0.20.2 + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.6.2 - globby@11.1.0: + cross-spawn@7.0.3: dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 - graceful-fs@4.2.10: {} + dargs@8.1.0: {} - graphemer@1.4.0: {} + debug@2.6.9: + dependencies: + ms: 2.0.0 - hard-rejection@2.1.0: {} + debug@4.3.7: + dependencies: + ms: 2.1.3 - has-flag@3.0.0: {} + deep-eql@5.0.2: {} - has-flag@4.0.0: {} + depd@2.0.0: {} - has@1.0.3: + dot-prop@5.3.0: dependencies: - function-bind: 1.1.1 + is-obj: 2.0.0 - header-range-parser@1.1.3: {} + eastasianwidth@0.2.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} - hosted-git-info@2.8.9: {} + env-paths@2.2.1: {} - hosted-git-info@4.1.0: + error-ex@1.3.2: dependencies: - lru-cache: 6.0.0 + is-arrayish: 0.2.1 - html-escaper@2.0.2: {} + es-escape-html@0.1.1: {} - human-signals@2.1.0: {} + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 - human-signals@4.3.1: {} + escalade@3.1.1: {} - husky@8.0.3: {} + escape-string-regexp@1.0.5: {} - ignore@5.2.4: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.0 - import-fresh@3.3.0: + express-session@1.18.0: dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 + cookie: 0.6.0 + cookie-signature: 1.0.7 + debug: 2.6.9 + depd: 2.0.0 + on-headers: 1.0.2 + parseurl: 1.3.3 + safe-buffer: 5.2.1 + uid-safe: 2.1.5 + transitivePeerDependencies: + - supports-color - imurmurhash@0.1.4: {} + fast-deep-equal@3.1.3: {} - indent-string@4.0.0: {} + find-up@7.0.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 - inflight@1.0.6: + foreground-child@3.3.0: dependencies: - once: 1.4.0 - wrappy: 1.0.2 + cross-spawn: 7.0.3 + signal-exit: 4.1.0 - inherits@2.0.4: {} + fsevents@2.3.3: + optional: true - ini@1.3.8: {} + get-caller-file@2.0.5: {} - ipaddr.js@2.1.0: {} + get-func-name@2.0.2: {} - is-arrayish@0.2.1: {} + git-raw-commits@4.0.0: + dependencies: + dargs: 8.1.0 + meow: 12.1.1 + split2: 4.2.0 - is-core-module@2.11.0: + glob@10.4.5: dependencies: - has: 1.0.3 + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 - is-docker@2.2.1: {} + global-directory@4.0.1: + dependencies: + ini: 4.1.1 - is-docker@3.0.0: {} + has-flag@3.0.0: {} - is-extglob@2.1.1: {} + has-flag@4.0.0: {} - is-fullwidth-code-point@3.0.0: {} + header-range-parser@1.1.3: {} - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 + html-escaper@2.0.2: {} - is-inside-container@1.0.0: - dependencies: - is-docker: 3.0.0 + husky@9.1.6: {} - is-number@7.0.0: {} + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 - is-obj@2.0.0: {} + import-meta-resolve@4.1.0: {} - is-path-inside@3.0.3: {} + ini@4.1.1: {} - is-plain-obj@1.1.0: {} + ipaddr.js@2.2.0: {} - is-stream@2.0.1: {} + is-arrayish@0.2.1: {} - is-stream@3.0.0: {} + is-fullwidth-code-point@3.0.0: {} - is-text-path@1.0.1: - dependencies: - text-extensions: 1.9.0 + is-obj@2.0.0: {} - is-wsl@2.2.0: + is-text-path@2.0.0: dependencies: - is-docker: 2.2.1 + text-extensions: 2.4.0 isexe@2.0.0: {} - istanbul-lib-coverage@3.2.0: {} + istanbul-lib-coverage@3.2.2: {} istanbul-lib-report@3.0.1: dependencies: - istanbul-lib-coverage: 3.2.0 + istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-reports@3.1.6: + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.3.7 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@1.21.6: {} + js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -3036,43 +2166,18 @@ snapshots: json-parse-even-better-errors@2.3.1: {} - json-schema-traverse@0.4.1: {} - json-schema-traverse@1.0.0: {} - json-stable-stringify-without-jsonify@1.0.1: {} - - jsonfile@6.1.0: - dependencies: - universalify: 2.0.0 - optionalDependencies: - graceful-fs: 4.2.10 - jsonparse@1.3.1: {} - kind-of@6.0.3: {} - - kleur@4.1.5: {} - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - lines-and-columns@1.2.4: {} - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - - locate-path@6.0.0: + locate-path@7.2.0: dependencies: - p-locate: 5.0.0 + p-locate: 6.0.0 lodash.camelcase@4.3.0: {} - lodash.isfunction@3.0.9: {} - lodash.isplainobject@4.0.6: {} lodash.kebabcase@4.1.1: {} @@ -3089,154 +2194,63 @@ snapshots: lodash.upperfirst@4.3.1: {} - lodash@4.17.21: {} + loupe@3.1.1: + dependencies: + get-func-name: 2.0.2 + + lru-cache@10.4.3: {} lru-cache@6.0.0: dependencies: yallist: 4.0.0 - make-dir@4.0.0: - dependencies: - semver: 7.5.4 - - make-error@1.3.6: {} - - map-obj@1.0.1: {} - - map-obj@4.3.0: {} - - meow@8.1.2: + magic-string@0.30.11: dependencies: - '@types/minimist': 1.2.2 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - - merge-stream@2.0.0: {} - - merge2@1.4.1: {} + '@jridgewell/sourcemap-codec': 1.5.0 - micromatch@4.0.5: + magicast@0.3.5: dependencies: - braces: 3.0.3 - picomatch: 2.3.1 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 + source-map-js: 1.2.1 - milliparsec@2.3.0: {} - - mime-db@1.52.0: {} - - mime-types@2.1.35: + make-dir@4.0.0: dependencies: - mime-db: 1.52.0 - - mimic-fn@2.1.0: {} + semver: 7.5.4 - mimic-fn@4.0.0: {} + meow@12.1.1: {} - min-indent@1.0.1: {} + milliparsec@4.0.0: {} - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 + mime@4.0.4: {} - minimist-options@4.1.0: + minimatch@9.0.5: dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 + brace-expansion: 2.0.1 minimist@1.2.8: {} - mri@1.2.0: {} + minipass@7.1.2: {} ms@2.0.0: {} - ms@2.1.2: {} + ms@2.1.3: {} - natural-compare@1.4.0: {} + nanoid@3.3.7: {} negotiator@0.6.3: {} - node-fetch@2.6.9: - dependencies: - whatwg-url: 5.0.0 - - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.1 - semver: 5.7.1 - validate-npm-package-license: 3.0.4 - - normalize-package-data@3.0.3: - dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.11.0 - semver: 7.3.8 - validate-npm-package-license: 3.0.4 - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - - npm-run-path@5.1.0: - dependencies: - path-key: 4.0.0 - on-headers@1.0.2: {} - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 - - open@9.1.0: - dependencies: - default-browser: 4.0.0 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - is-wsl: 2.2.0 - - optionator@0.9.3: - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@4.1.0: + p-limit@4.0.0: dependencies: - p-limit: 2.3.0 + yocto-queue: 1.1.1 - p-locate@5.0.0: + p-locate@6.0.0: dependencies: - p-limit: 3.1.0 + p-limit: 4.0.0 - p-try@2.2.0: {} + package-json-from-dist@1.0.0: {} parent-module@1.0.1: dependencies: @@ -3251,63 +2265,32 @@ snapshots: parseurl@1.3.3: {} - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} + path-exists@5.0.0: {} path-key@3.1.1: {} - path-key@4.0.0: {} - - path-parse@1.0.7: {} - - path-type@4.0.0: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 - picocolors@1.0.0: {} + pathe@1.1.2: {} - picomatch@2.3.1: {} + pathval@2.0.0: {} - prelude-ls@1.2.1: {} + picocolors@1.1.0: {} - prettier-linter-helpers@1.0.0: + postcss@8.4.47: dependencies: - fast-diff: 1.2.0 - - prettier@3.0.3: {} + nanoid: 3.3.7 + picocolors: 1.1.0 + source-map-js: 1.2.1 punycode@2.3.0: {} - queue-microtask@1.2.3: {} - - quick-lru@4.0.1: {} - random-bytes@1.0.0: {} - read-pkg-up@7.0.1: - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - - read-pkg@5.2.0: - dependencies: - '@types/normalize-package-data': 2.4.1 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - redent@3.0.0: - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - - regexparam@2.0.1: {} + regexparam@2.0.2: {} require-directory@2.1.1: {} @@ -3317,77 +2300,53 @@ snapshots: resolve-from@5.0.0: {} - resolve-global@1.0.0: - dependencies: - global-dirs: 0.1.1 - - resolve@1.22.1: - dependencies: - is-core-module: 2.11.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - reusify@1.0.4: {} - - rimraf@3.0.2: + rollup@4.21.3: dependencies: - glob: 7.2.3 - - rollup@3.29.4: + '@types/estree': 1.0.5 optionalDependencies: - fsevents: 2.3.2 - - run-applescript@5.0.0: - dependencies: - execa: 5.1.1 - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - sade@1.8.1: - dependencies: - mri: 1.2.0 + '@rollup/rollup-android-arm-eabi': 4.21.3 + '@rollup/rollup-android-arm64': 4.21.3 + '@rollup/rollup-darwin-arm64': 4.21.3 + '@rollup/rollup-darwin-x64': 4.21.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.3 + '@rollup/rollup-linux-arm-musleabihf': 4.21.3 + '@rollup/rollup-linux-arm64-gnu': 4.21.3 + '@rollup/rollup-linux-arm64-musl': 4.21.3 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.3 + '@rollup/rollup-linux-riscv64-gnu': 4.21.3 + '@rollup/rollup-linux-s390x-gnu': 4.21.3 + '@rollup/rollup-linux-x64-gnu': 4.21.3 + '@rollup/rollup-linux-x64-musl': 4.21.3 + '@rollup/rollup-win32-arm64-msvc': 4.21.3 + '@rollup/rollup-win32-ia32-msvc': 4.21.3 + '@rollup/rollup-win32-x64-msvc': 4.21.3 + fsevents: 2.3.3 safe-buffer@5.2.1: {} - semver@5.7.1: {} - - semver@7.3.8: - dependencies: - lru-cache: 6.0.0 - semver@7.5.4: dependencies: lru-cache: 6.0.0 + semver@7.6.3: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} - signal-exit@3.0.7: {} + siginfo@2.0.0: {} - slash@3.0.0: {} + signal-exit@4.1.0: {} - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.13 - - spdx-exceptions@2.3.0: {} + source-map-js@1.2.1: {} - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.13 + split2@4.2.0: {} - spdx-license-ids@3.0.13: {} + stackback@0.0.2: {} - split2@3.2.2: - dependencies: - readable-stream: 3.6.2 + std-env@3.7.0: {} string-width@4.2.3: dependencies: @@ -3395,31 +2354,21 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string_decoder@1.3.0: + string-width@5.1.2: dependencies: - safe-buffer: 5.2.1 + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - strip-final-newline@2.0.0: {} - - strip-final-newline@3.0.0: {} - - strip-indent@3.0.0: + strip-ansi@7.1.0: dependencies: - min-indent: 1.0.1 - - strip-json-comments@3.1.1: {} + ansi-regex: 6.1.0 - supertest-fetch@1.5.0: - dependencies: - '@types/express': 4.17.17 - '@types/node-fetch': 2.6.2 - node-fetch: 2.6.9 - transitivePeerDependencies: - - encoding + supertest-fetch@2.0.0: {} supports-color@5.5.0: dependencies: @@ -3429,152 +2378,129 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-preserve-symlinks-flag@1.0.0: {} - - synckit@0.8.5: - dependencies: - '@pkgr/utils': 2.4.2 - tslib: 2.6.2 - - test-exclude@6.0.0: + test-exclude@7.0.1: dependencies: '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - - text-extensions@1.9.0: {} - - text-table@0.2.0: {} + glob: 10.4.5 + minimatch: 9.0.5 - through2@4.0.2: - dependencies: - readable-stream: 3.6.2 + text-extensions@2.4.0: {} through@2.3.8: {} - titleize@3.0.0: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tr46@0.0.3: {} - - trim-newlines@3.0.1: {} - - ts-api-utils@1.0.3(typescript@5.2.2): - dependencies: - typescript: 5.2.2 - - ts-node@10.9.1(@types/node@20.5.1)(typescript@5.2.2): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.3 - '@types/node': 20.5.1 - acorn: 8.8.2 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.2.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - - tslib@2.6.2: {} - - tsm@2.3.0: - dependencies: - esbuild: 0.15.18 + tinybench@2.9.0: {} - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 + tinyexec@0.3.0: {} - type-fest@0.18.1: {} + tinypool@1.0.1: {} - type-fest@0.20.2: {} + tinyrainbow@1.2.0: {} - type-fest@0.6.0: {} + tinyspy@3.0.2: {} - type-fest@0.8.1: {} + to-fast-properties@2.0.0: {} - typescript@5.2.2: {} + typescript@5.6.2: {} uid-safe@2.1.5: dependencies: random-bytes: 1.0.0 - universalify@2.0.0: {} + undici-types@6.19.8: {} - untildify@4.0.0: {} + unicorn-magic@0.1.0: {} uri-js@4.4.1: dependencies: punycode: 2.3.0 - util-deprecate@1.0.2: {} - - uvu@0.5.6: - dependencies: - dequal: 2.0.3 - diff: 5.1.0 - kleur: 4.1.5 - sade: 1.8.1 - - v8-compile-cache-lib@3.0.1: {} - - v8-to-istanbul@9.1.0: - dependencies: - '@jridgewell/trace-mapping': 0.3.17 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.9.0 - - validate-npm-package-license@3.0.4: + vite-node@2.1.1(@types/node@22.5.5): dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - - webidl-conversions@3.0.1: {} + cac: 6.7.14 + debug: 4.3.7 + pathe: 1.1.2 + vite: 5.4.5(@types/node@22.5.5) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser - whatwg-url@5.0.0: + vite@5.4.5(@types/node@22.5.5): dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 + esbuild: 0.21.5 + postcss: 8.4.47 + rollup: 4.21.3 + optionalDependencies: + '@types/node': 22.5.5 + fsevents: 2.3.3 + + vitest@2.1.1(@types/node@22.5.5): + dependencies: + '@vitest/expect': 2.1.1 + '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.5(@types/node@22.5.5)) + '@vitest/pretty-format': 2.1.1 + '@vitest/runner': 2.1.1 + '@vitest/snapshot': 2.1.1 + '@vitest/spy': 2.1.1 + '@vitest/utils': 2.1.1 + chai: 5.1.1 + debug: 4.3.7 + magic-string: 0.30.11 + pathe: 1.1.2 + std-env: 3.7.0 + tinybench: 2.9.0 + tinyexec: 0.3.0 + tinypool: 1.0.1 + tinyrainbow: 1.2.0 + vite: 5.4.5(@types/node@22.5.5) + vite-node: 2.1.1(@types/node@22.5.5) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.5.5 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser which@2.0.2: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - wrappy@1.0.2: {} + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 y18n@5.0.8: {} yallist@4.0.0: {} - yargs-parser@20.2.9: {} - yargs-parser@21.1.1: {} - yargs@17.7.1: - dependencies: - cliui: 8.0.1 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - yargs@17.7.2: dependencies: cliui: 8.0.1 @@ -3585,6 +2511,4 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yn@3.1.1: {} - - yocto-queue@0.1.0: {} + yocto-queue@1.1.1: {} diff --git a/rollup.config.js b/rollup.config.js deleted file mode 100644 index 038209d..0000000 --- a/rollup.config.js +++ /dev/null @@ -1,13 +0,0 @@ -import ts from '@rollup/plugin-typescript' - -export default { - input: 'src/index.ts', - output: [ - { - dir: 'dist', - format: 'esm' - } - ], - plugins: [ts({ tsconfig: './tsconfig.json' })], - external: ['crypto', '@tinyhttp/cookie', '@tinyhttp/cookie-signature'] -} diff --git a/src/index.ts b/src/index.ts index 713de85..d5e7a08 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,6 @@ -import { IncomingMessage, ServerResponse } from 'http' -import { ParsedUrlQuery } from 'querystring' -import { serialize, SerializeOptions } from '@tinyhttp/cookie' +import type { IncomingMessage, ServerResponse } from 'node:http' +import type { ParsedUrlQuery } from 'node:querystring' +import { type SerializeOptions, serialize } from '@tinyhttp/cookie' import { sign } from '@tinyhttp/cookie-signature' import { Tokens } from './token' diff --git a/src/token.ts b/src/token.ts index 200c901..cee211d 100644 --- a/src/token.ts +++ b/src/token.ts @@ -41,6 +41,6 @@ export class Tokens { } tokenize(secret: string, salt: string): string { - return salt + '-' + hash(salt + '-' + secret) + return `${salt}-${hash(`${salt}-${secret}`)}` } } diff --git a/src/utils.ts b/src/utils.ts index ce5d875..64532b3 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,4 +1,4 @@ -import { randomBytes, createHash, createHmac, timingSafeEqual } from 'crypto' +import { createHash, createHmac, randomBytes, timingSafeEqual } from 'node:crypto' /** * Generate a secure type safe UID with specified length. diff --git a/tests/cookie.spec.ts b/tests/cookie.spec.ts deleted file mode 100644 index 09f75f2..0000000 --- a/tests/cookie.spec.ts +++ /dev/null @@ -1,231 +0,0 @@ -import { suite } from 'uvu' -import * as assert from 'uvu/assert' -import type { CSRFOptions } from '../src/index' -import { initApp } from './helper' - -const output = suite('unsigned cookie - output') - -output('should output a csrf token', async () => { - const { fetch } = initApp({ middleware: 'cookie' }) - - const response = await fetch('/') - const body = await response.json() - - assert.is(response.status, 200) - assert.ok(response.headers.has('set-cookie')) - assert.ok(response.headers.get('set-cookie').startsWith('_csrf=')) - assert.type(body.token, 'string') -}) - -output('should output a csrf token with given options (different salt & secret length)', async () => { - const options: CSRFOptions = { - saltLength: 10, - secretLength: 30 - } - const { fetch } = initApp({ middleware: 'cookie', options }) - - const response = await fetch('/') - const body = await response.json() - - const [salt, _] = body.token.split('-') - assert.is(response.status, 200) - assert.is(salt.length, 10) -}) - -output('should output a csrf token with given options (different cookie path)', async () => { - const options: CSRFOptions = { - cookie: { - path: '/admin', - key: 'virus' - } - } - const { fetch } = initApp({ middleware: 'cookie', options }) - - const response = await fetch('/') - const body = await response.json() - - const [token, path] = response.headers.get('set-cookie').split(' ') - - assert.is(response.status, 200) - assert.ok(response.headers.has('set-cookie')) - assert.ok(token.startsWith('virus')) - assert.is(path.split('Path=')[1], '/admin') - assert.type(body.token, 'string') -}) - -output.run() - -const body = suite('unsigned cookie - req.body') - -body('should be able to pass through req.body', async () => { - const { fetch } = initApp({ middleware: 'cookie', parser: 'json' }) - const request = await fetch('/') - const requestBody = await request.json() - - const response = await fetch('/', { - method: 'post', - body: JSON.stringify({ _csrf: requestBody.token, hello: 'there' }), - headers: { - cookie: request.headers.get('set-cookie'), - 'content-type': 'application/json' - } - }) - const body = await response.json() - - assert.is(response.status, 200) - assert.is(body.message, 'hello') -}) - -body('should not be able to pass through req.body', async () => { - const { fetch } = initApp({ middleware: 'cookie', parser: 'json' }) - const request = await fetch('/') - - const response = await fetch('/', { - timeout: 5000, - method: 'post', - body: '{}', - headers: { - cookie: request.headers.get('set-cookie'), - 'content-type': 'application/json' - } - }) - const body = await response.text() - - assert.is(response.status, 403) - assert.is(body, 'invalid csrf token') -}) - -body.run() - -const query = suite('unsigned cookie - req.query') - -query('should be able to pass through query', async () => { - const { fetch } = initApp({ middleware: 'cookie' }) - const request = await fetch('/') - const requestBody = await request.json() - - const response = await fetch(`/?_csrf=${encodeURIComponent(requestBody.token)}`, { - method: 'post', - headers: { - cookie: request.headers.get('set-cookie'), - 'content-type': 'application/x-www-form-urlencoded' - } - }) - const body = await response.json() - - assert.is(response.status, 200) - assert.is(body.message, 'hello') -}) - -query.run() - -const header = suite('unsigned cookie - req.headers') - -header('should be able to pass through headers csrf-token', async () => { - const { fetch } = initApp({ middleware: 'cookie' }) - const request = await fetch('/') - const requestBody = await request.json() - - const response = await fetch(`/`, { - method: 'post', - headers: { - cookie: request.headers.get('set-cookie'), - 'csrf-token': requestBody.token - } - }) - const body = await response.json() - - assert.is(response.status, 200) - assert.is(body.message, 'hello') -}) - -header('should be able to pass through headers xsrf-token', async () => { - const { fetch } = initApp({ middleware: 'cookie' }) - const request = await fetch('/') - const requestBody = await request.json() - - const response = await fetch(`/`, { - method: 'post', - headers: { - cookie: request.headers.get('set-cookie'), - 'xsrf-token': requestBody.token - } - }) - const body = await response.json() - - assert.is(response.status, 200) - assert.is(body.message, 'hello') -}) - -header('should be able to pass through headers x-csrf-token', async () => { - const { fetch } = initApp({ middleware: 'cookie' }) - const request = await fetch('/') - const requestBody = await request.json() - - const response = await fetch(`/`, { - method: 'post', - headers: { - cookie: request.headers.get('set-cookie'), - 'x-csrf-token': requestBody.token - } - }) - const body = await response.json() - - assert.is(response.status, 200) - assert.is(body.message, 'hello') -}) - -header('should be able to pass through headers x-xsrf-token', async () => { - const { fetch } = initApp({ middleware: 'cookie' }) - const request = await fetch('/') - const requestBody = await request.json() - - const response = await fetch(`/`, { - method: 'post', - headers: { - cookie: request.headers.get('set-cookie'), - 'x-xsrf-token': requestBody.token - } - }) - const body = await response.json() - - assert.is(response.status, 200) - assert.is(body.message, 'hello') -}) - -header.run() - -const reusable = suite('reusable token') - -reusable('a', async () => { - const { fetch } = initApp({ middleware: 'cookie' }) - const request = await fetch('/') - const requestBody = await request.json() - - // response #1 - const response1 = await fetch(`/`, { - method: 'post', - headers: { - cookie: request.headers.get('set-cookie'), - 'x-xsrf-token': requestBody.token - } - }) - const body1 = await response1.json() - - // response #2 - const response2 = await fetch(`/`, { - method: 'post', - headers: { - cookie: request.headers.get('set-cookie'), - 'x-xsrf-token': requestBody.token - } - }) - const body2 = await response2.json() - - assert.is(response1.status, 200) - assert.is(response2.status, 200) - assert.equal(body1.message, 'hello') - assert.equal(body2.message, 'hello') -}) - -reusable.run() diff --git a/tests/cookie.test.ts b/tests/cookie.test.ts new file mode 100644 index 0000000..8582163 --- /dev/null +++ b/tests/cookie.test.ts @@ -0,0 +1,262 @@ +import { assert, describe, it } from 'vitest' +import { onTestFinished } from 'vitest' +import type { CSRFOptions } from '../src/index' +import { initApp } from './helper' + +describe('unsigned cookie - output', () => { + it('should output a csrf token', async () => { + const { fetch, server } = initApp({ middleware: 'cookie' }) + onTestFinished(() => { + server.close() + }) + + const response = await fetch('/') + const body = await response.json() + + assert.equal(response.status, 200) + assert.ok(response.headers.has('set-cookie')) + assert.ok(response.headers.get('set-cookie')?.startsWith('_csrf=')) + assert.typeOf(body.token, 'string') + }) + + it('should output a csrf token with given options (different salt & secret length)', async () => { + const options: CSRFOptions = { + saltLength: 10, + secretLength: 30 + } + const { fetch, server } = initApp({ middleware: 'cookie', options }) + onTestFinished(() => { + server.close() + }) + + const response = await fetch('/') + const body = await response.json() + + const [salt, _] = body.token.split('-') + assert.equal(response.status, 200) + assert.equal(salt.length, 10) + }) + + it('should output a csrf token with given options (different cookie path)', async () => { + const options: CSRFOptions = { + cookie: { + path: '/admin', + key: 'virus' + } + } + const { fetch, server } = initApp({ middleware: 'cookie', options }) + onTestFinished(() => { + server.close() + }) + + const response = await fetch('/') + const body = await response.json() + + const [token, path] = response.headers.get('set-cookie')?.split(' ') ?? ['', ''] + + assert.equal(response.status, 200) + assert.ok(response.headers.has('set-cookie')) + assert.ok(token.startsWith('virus')) + assert.equal(path.split('Path=')[1], '/admin') + assert.typeOf(body.token, 'string') + }) +}) + +describe('unsigned cookie - req.body', () => { + it('should be able to pass through req.body', async () => { + const { fetch, server } = initApp({ middleware: 'cookie', parser: 'json' }) + onTestFinished(() => { + server.close() + }) + + const request = await fetch('/') + const requestBody = await request.json() + + const response = await fetch('/', { + method: 'post', + body: JSON.stringify({ _csrf: requestBody.token, hello: 'there' }), + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'content-type': 'application/json' + } + }) + const body = await response.json() + + assert.equal(response.status, 200) + assert.equal(body.message, 'hello') + }) + + it('should not be able to pass through req.body', async () => { + const { fetch, server } = initApp({ middleware: 'cookie', parser: 'json' }) + onTestFinished(() => { + server.close() + }) + const request = await fetch('/') + + const abortController = new AbortController() + const timeout = setTimeout(() => abortController.abort(), 5000) + + try { + const response = await fetch('/', { + method: 'post', + body: '{}', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'content-type': 'application/json' + }, + signal: abortController.signal + }) + const body = await response.text() + + assert.equal(response.status, 403) + assert.equal(body, 'invalid csrf token') + } finally { + clearTimeout(timeout) + } + }) +}) + +describe('unsigned cookie - req.query', () => { + it('should be able to pass through query', async () => { + const { fetch, server } = initApp({ middleware: 'cookie' }) + onTestFinished(() => { + server.close() + }) + const request = await fetch('/') + const requestBody = await request.json() + + const response = await fetch(`/?_csrf=${encodeURIComponent(requestBody.token)}`, { + method: 'post', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'content-type': 'application/x-www-form-urlencoded' + } + }) + const body = await response.json() + + assert.equal(response.status, 200) + assert.equal(body.message, 'hello') + }) +}) + +describe('unsigned cookie - req.headers', () => { + it('should be able to pass through headers csrf-token', async () => { + const { fetch, server } = initApp({ middleware: 'cookie' }) + onTestFinished(() => { + server.close() + }) + const request = await fetch('/') + const requestBody = await request.json() + + const response = await fetch('/', { + method: 'post', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'csrf-token': requestBody.token + } + }) + const body = await response.json() + + assert.equal(response.status, 200) + assert.equal(body.message, 'hello') + }) + + it('should be able to pass through headers xsrf-token', async () => { + const { fetch, server } = initApp({ middleware: 'cookie' }) + onTestFinished(() => { + server.close() + }) + const request = await fetch('/') + const requestBody = await request.json() + + const response = await fetch('/', { + method: 'post', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'xsrf-token': requestBody.token + } + }) + const body = await response.json() + + assert.equal(response.status, 200) + assert.equal(body.message, 'hello') + }) + + it('should be able to pass through headers x-csrf-token', async () => { + const { fetch, server } = initApp({ middleware: 'cookie' }) + onTestFinished(() => { + server.close() + }) + const request = await fetch('/') + const requestBody = await request.json() + + const response = await fetch('/', { + method: 'post', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'x-csrf-token': requestBody.token + } + }) + const body = await response.json() + + assert.equal(response.status, 200) + assert.equal(body.message, 'hello') + }) + + it('should be able to pass through headers x-xsrf-token', async () => { + const { fetch, server } = initApp({ middleware: 'cookie' }) + onTestFinished(() => { + server.close() + }) + const request = await fetch('/') + const requestBody = await request.json() + + const response = await fetch('/', { + method: 'post', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'x-xsrf-token': requestBody.token + } + }) + const body = await response.json() + + assert.equal(response.status, 200) + assert.equal(body.message, 'hello') + }) +}) + +describe('reusable token', () => { + it('a', async () => { + const { fetch, server } = initApp({ middleware: 'cookie' }) + onTestFinished(() => { + server.close() + }) + const request = await fetch('/') + const requestBody = await request.json() + + // response #1 + const response1 = await fetch('/', { + method: 'post', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'x-xsrf-token': requestBody.token + } + }) + const body1 = await response1.json() + + // response #2 + const response2 = await fetch('/', { + method: 'post', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'x-xsrf-token': requestBody.token + } + }) + const body2 = await response2.json() + + assert.equal(response1.status, 200) + assert.equal(response2.status, 200) + assert.equal(body1.message, 'hello') + assert.equal(body2.message, 'hello') + }) +}) diff --git a/tests/failing.spec.ts b/tests/failing.spec.ts deleted file mode 100644 index 6a0121b..0000000 --- a/tests/failing.spec.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { makeFetch } from 'supertest-fetch' -import { App, Request } from '@tinyhttp/app' -import { cookieParser } from '@tinyhttp/cookie-parser' -import { urlencoded } from 'milliparsec' -import { suite } from 'uvu' -import * as assert from 'uvu/assert' -import { csrf } from '../src/index' -import type { CSRFRequest } from '../src/index' - -const failing = suite('failing - these should return error') - -failing('without a cookie parser', async () => { - const app = new App() - const csrfProtection = csrf({ cookie: { signed: false } }) - app.use('/', urlencoded(), csrfProtection, (req, res) => { - res.status(200).json({ token: req.csrfToken() }) - }) - const server = app.listen() - - const fetch = makeFetch(server) - - const response = await fetch('/') - const body = await response.text() - - assert.is(response.status, 500) - assert.is(body, 'misconfigured csrf') -}) - -failing('signed but without a secret', async () => { - const app = new App() - app.use(cookieParser()) - const csrfProtection = csrf({ cookie: { signed: true } }) - app.use('/', urlencoded(), csrfProtection, (req, res) => { - res.status(200).json({ token: req.csrfToken() }) - }) - const server = app.listen() - - const fetch = makeFetch(server) - - const response = await fetch('/') - const body = await response.text() - - assert.is(response.status, 500) - assert.is(body, 'misconfigured csrf') -}) - -failing('session without the session middleware', async () => { - const app = new App() - const csrfProtection = csrf({ middleware: 'session' }) - app.use('/', urlencoded(), csrfProtection, (req, res) => { - res.status(200).json({ token: req.csrfToken() }) - }) - const server = app.listen() - - const fetch = makeFetch(server) - - const response = await fetch('/') - const body = await response.text() - - assert.is(response.status, 500) - assert.is(body, 'misconfigured csrf') -}) - -failing.run() diff --git a/tests/failing.test.ts b/tests/failing.test.ts new file mode 100644 index 0000000..755ebba --- /dev/null +++ b/tests/failing.test.ts @@ -0,0 +1,71 @@ +import { App, type Request } from '@tinyhttp/app' +import { cookieParser } from '@tinyhttp/cookie-parser' +import { urlencoded } from 'milliparsec' +import { makeFetch } from 'supertest-fetch' +import { assert, describe, it } from 'vitest' +import { onTestFinished } from 'vitest' +import { csrf } from '../src/index' +import type { CSRFRequest } from '../src/index' + +describe('failing - these should return error', () => { + it('without a cookie parser', async () => { + const app = new App() + const csrfProtection = csrf({ cookie: { signed: false } }) + app.use('/', urlencoded(), csrfProtection, (req, res) => { + res.status(200).json({ token: req.csrfToken() }) + }) + const server = app.listen() + onTestFinished(() => { + server.close() + }) + + const fetch = makeFetch(server) + + const response = await fetch('/') + const body = await response.text() + + assert.equal(response.status, 500) + assert.equal(body, 'misconfigured csrf') + }) + + it('signed but without a secret', async () => { + const app = new App() + app.use(cookieParser()) + const csrfProtection = csrf({ cookie: { signed: true } }) + app.use('/', urlencoded(), csrfProtection, (req, res) => { + res.status(200).json({ token: req.csrfToken() }) + }) + const server = app.listen() + onTestFinished(() => { + server.close() + }) + + const fetch = makeFetch(server) + + const response = await fetch('/') + const body = await response.text() + + assert.equal(response.status, 500) + assert.equal(body, 'misconfigured csrf') + }) + + it('session without the session middleware', async () => { + const app = new App() + const csrfProtection = csrf({ middleware: 'session' }) + app.use('/', urlencoded(), csrfProtection, (req, res) => { + res.status(200).json({ token: req.csrfToken() }) + }) + const server = app.listen() + onTestFinished(() => { + server.close() + }) + + const fetch = makeFetch(server) + + const response = await fetch('/') + const body = await response.text() + + assert.equal(response.status, 500) + assert.equal(body, 'misconfigured csrf') + }) +}) diff --git a/tests/helper.ts b/tests/helper.ts index 1afe3c0..480f025 100644 --- a/tests/helper.ts +++ b/tests/helper.ts @@ -1,12 +1,12 @@ -import { randomBytes } from 'crypto' -import { makeFetch } from 'supertest-fetch' +import { randomBytes } from 'node:crypto' import { App } from '@tinyhttp/app' import type { Request, Response } from '@tinyhttp/app' import { cookieParser } from '@tinyhttp/cookie-parser' import session from 'express-session' -import { urlencoded, json } from 'milliparsec' +import { json, urlencoded } from 'milliparsec' +import { makeFetch } from 'supertest-fetch' import { csrf } from '../src/index' -import { CSRFOptions, CSRFRequest } from '../src/index' +import type { CSRFOptions, CSRFRequest } from '../src/index' type ParserOptions = 'urlencoded' | 'json' | '' type MiddlewareOptions = 'cookie' | 'signedCookie' | 'session' @@ -20,7 +20,7 @@ interface initAppOptions { const secret = randomBytes(32).toString('base64') export function initApp({ parser, options = {}, middleware = 'cookie' }: initAppOptions) { - const app = new App() + const app = new App() const csrfProtection = csrf(parseOptions(options, middleware)) if (parser === 'urlencoded') { diff --git a/tests/session.spec.ts b/tests/session.spec.ts deleted file mode 100644 index cac1566..0000000 --- a/tests/session.spec.ts +++ /dev/null @@ -1,221 +0,0 @@ -import { suite } from 'uvu' -import * as assert from 'uvu/assert' -import type { CSRFOptions } from '../src/index' -import { initApp } from './helper' - -const options: CSRFOptions = { - middleware: 'session' -} - -const output = suite('session - output') - -output('should output a csrf token', async () => { - const { fetch } = initApp({ middleware: 'session', options }) - - const response = await fetch('/') - const body = await response.json() - - assert.is(response.status, 200) - assert.ok(response.headers.has('set-cookie')) - assert.type(body.token, 'string') -}) - -output('should output a csrf token with given options (different salt & secret length)', async () => { - const saltySecret: CSRFOptions = { - saltLength: 10, - secretLength: 30 - } - const { fetch } = initApp({ middleware: 'session', options: { ...options, ...saltySecret } }) - - const response = await fetch('/') - const body = await response.json() - - const [salt, _] = body.token.split('-') - assert.is(response.status, 200) - assert.is(salt.length, 10) -}) - -output.run() - -const body = suite('session - req.body') - -body('should be able to pass through req.body', async () => { - const { fetch } = initApp({ middleware: 'session', parser: 'json', options }) - - const request = await fetch('/') - const requestBody = await request.json() - - const response = await fetch('/', { - method: 'post', - body: JSON.stringify({ _csrf: requestBody.token, hello: 'there' }), - headers: { - cookie: request.headers.get('set-cookie'), - 'content-type': 'application/json' - } - }) - const body = await response.json() - - assert.is(response.status, 200) - assert.is(body.message, 'hello') -}) - -body('should not be able to pass through req.body', async () => { - const { fetch } = initApp({ middleware: 'session', parser: 'json', options }) - - const request = await fetch('/') - - const response = await fetch('/', { - timeout: 5000, - method: 'post', - body: '{}', - headers: { - cookie: request.headers.get('set-cookie'), - 'content-type': 'application/json' - } - }) - const body = await response.text() - - assert.is(response.status, 403) - assert.is(body, 'invalid csrf token') -}) - -body.run() - -const query = suite('session - req.query') - -query('should be able to pass through query', async () => { - const { fetch } = initApp({ middleware: 'session', options }) - - const request = await fetch('/') - const requestBody = await request.json() - - const response = await fetch(`/?_csrf=${encodeURIComponent(requestBody.token)}`, { - method: 'post', - headers: { - cookie: request.headers.get('set-cookie'), - 'content-type': 'application/x-www-form-urlencoded' - } - }) - const body = await response.json() - - assert.is(response.status, 200) - assert.is(body.message, 'hello') -}) - -query.run() - -const header = suite('session - req.headers') - -header('should be able to pass through headers csrf-token', async () => { - const { fetch } = initApp({ middleware: 'session', options }) - - const request = await fetch('/') - const requestBody = await request.json() - - const response = await fetch(`/`, { - method: 'post', - headers: { - cookie: request.headers.get('set-cookie'), - 'csrf-token': requestBody.token - } - }) - const body = await response.json() - - assert.is(response.status, 200) - assert.is(body.message, 'hello') -}) - -header('should be able to pass through headers xsrf-token', async () => { - const { fetch } = initApp({ middleware: 'session', options }) - - const request = await fetch('/') - const requestBody = await request.json() - - const response = await fetch(`/`, { - method: 'post', - headers: { - cookie: request.headers.get('set-cookie'), - 'xsrf-token': requestBody.token - } - }) - const body = await response.json() - - assert.is(response.status, 200) - assert.is(body.message, 'hello') -}) - -header('should be able to pass through headers x-csrf-token', async () => { - const { fetch } = initApp({ middleware: 'session', options }) - - const request = await fetch('/') - const requestBody = await request.json() - - const response = await fetch(`/`, { - method: 'post', - headers: { - cookie: request.headers.get('set-cookie'), - 'x-csrf-token': requestBody.token - } - }) - const body = await response.json() - - assert.is(response.status, 200) - assert.is(body.message, 'hello') -}) - -header('should be able to pass through headers x-xsrf-token', async () => { - const { fetch } = initApp({ middleware: 'session', options }) - - const request = await fetch('/') - const requestBody = await request.json() - - const response = await fetch(`/`, { - method: 'post', - headers: { - cookie: request.headers.get('set-cookie'), - 'x-xsrf-token': requestBody.token - } - }) - const body = await response.json() - - assert.is(response.status, 200) - assert.is(body.message, 'hello') -}) - -header.run() - -const reusable = suite('reusable token') - -reusable('a', async () => { - const { fetch } = initApp({ middleware: 'session', options }) - - const request = await fetch('/') - const requestBody = await request.json() - - // response #1 - const response1 = await fetch(`/`, { - method: 'post', - headers: { - cookie: request.headers.get('set-cookie'), - 'x-xsrf-token': requestBody.token - } - }) - const body1 = await response1.json() - - // response #2 - const response2 = await fetch(`/`, { - method: 'post', - headers: { - cookie: request.headers.get('set-cookie'), - 'x-xsrf-token': requestBody.token - } - }) - const body2 = await response2.json() - - assert.is(response1.status, 200) - assert.is(response2.status, 200) - assert.equal(body1.message, 'hello') - assert.equal(body2.message, 'hello') -}) - -reusable.run() diff --git a/tests/session.test.ts b/tests/session.test.ts new file mode 100644 index 0000000..a6456d9 --- /dev/null +++ b/tests/session.test.ts @@ -0,0 +1,247 @@ +import { assert, describe, it } from 'vitest' +import { onTestFinished } from 'vitest' +import type { CSRFOptions } from '../src/index' +import { initApp } from './helper' + +const options: CSRFOptions = { + middleware: 'session' +} + +describe('session - output', () => { + it('should output a csrf token', async () => { + const { fetch, server } = initApp({ middleware: 'session', options }) + onTestFinished(() => { + server.close() + }) + + const response = await fetch('/') + const body = await response.json() + + assert.equal(response.status, 200) + assert.ok(response.headers.has('set-cookie')) + assert.typeOf(body.token, 'string') + }) + + it('should output a csrf token with given options (different salt & secret length)', async () => { + const saltySecret: CSRFOptions = { + saltLength: 10, + secretLength: 30 + } + const { fetch, server } = initApp({ middleware: 'session', options: { ...options, ...saltySecret } }) + onTestFinished(() => { + server.close() + }) + + const response = await fetch('/') + const body = await response.json() + + const [salt, _] = body.token.split('-') + assert.equal(response.status, 200) + assert.equal(salt.length, 10) + }) +}) + +describe('session - req.body', () => { + it('should be able to pass through req.body', async () => { + const { fetch, server } = initApp({ middleware: 'session', parser: 'json', options }) + onTestFinished(() => { + server.close() + }) + + const request = await fetch('/') + const requestBody = await request.json() + + const response = await fetch('/', { + method: 'post', + body: JSON.stringify({ _csrf: requestBody.token, hello: 'there' }), + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'content-type': 'application/json' + } + }) + const body = await response.json() + + assert.equal(response.status, 200) + assert.equal(body.message, 'hello') + }) + + it('should not be able to pass through req.body', async () => { + const { fetch, server } = initApp({ middleware: 'session', parser: 'json', options }) + onTestFinished(() => { + server.close() + }) + + const request = await fetch('/') + const abortController = new AbortController() + const timeout = setTimeout(() => abortController.abort(), 5000) + + try { + const response = await fetch('/', { + method: 'post', + body: '{}', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'content-type': 'application/json' + }, + signal: abortController.signal + }) + const body = await response.text() + + assert.equal(response.status, 403) + assert.equal(body, 'invalid csrf token') + } finally { + clearTimeout(timeout) + } + }) +}) + +describe('session - req.query', () => { + it('should be able to pass through query', async () => { + const { fetch, server } = initApp({ middleware: 'session', options }) + onTestFinished(() => { + server.close() + }) + + const request = await fetch('/') + const requestBody = await request.json() + + const response = await fetch(`/?_csrf=${encodeURIComponent(requestBody.token)}`, { + method: 'post', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'content-type': 'application/x-www-form-urlencoded' + } + }) + const body = await response.json() + + assert.equal(response.status, 200) + assert.equal(body.message, 'hello') + }) +}) + +describe('session - req.headers', () => { + it('should be able to pass through headers csrf-token', async () => { + const { fetch, server } = initApp({ middleware: 'session', options }) + onTestFinished(() => { + server.close() + }) + + const request = await fetch('/') + const requestBody = await request.json() + + const response = await fetch('/', { + method: 'post', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'csrf-token': requestBody.token + } + }) + const body = await response.json() + + assert.equal(response.status, 200) + assert.equal(body.message, 'hello') + }) + + it('should be able to pass through headers xsrf-token', async () => { + const { fetch, server } = initApp({ middleware: 'session', options }) + onTestFinished(() => { + server.close() + }) + + const request = await fetch('/') + const requestBody = await request.json() + + const response = await fetch('/', { + method: 'post', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'xsrf-token': requestBody.token + } + }) + const body = await response.json() + + assert.equal(response.status, 200) + assert.equal(body.message, 'hello') + }) + + it('should be able to pass through headers x-csrf-token', async () => { + const { fetch, server } = initApp({ middleware: 'session', options }) + onTestFinished(() => { + server.close() + }) + + const request = await fetch('/') + const requestBody = await request.json() + + const response = await fetch('/', { + method: 'post', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'x-csrf-token': requestBody.token + } + }) + const body = await response.json() + + assert.equal(response.status, 200) + assert.equal(body.message, 'hello') + }) + + it('should be able to pass through headers x-xsrf-token', async () => { + const { fetch, server } = initApp({ middleware: 'session', options }) + onTestFinished(() => { + server.close() + }) + + const request = await fetch('/') + const requestBody = await request.json() + + const response = await fetch('/', { + method: 'post', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'x-xsrf-token': requestBody.token + } + }) + const body = await response.json() + + assert.equal(response.status, 200) + assert.equal(body.message, 'hello') + }) +}) + +describe('reusable token', () => { + it('a', async () => { + const { fetch, server } = initApp({ middleware: 'session', options }) + onTestFinished(() => { + server.close() + }) + + const request = await fetch('/') + const requestBody = await request.json() + + // response #1 + const response1 = await fetch('/', { + method: 'post', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'x-xsrf-token': requestBody.token + } + }) + const body1 = await response1.json() + + // response #2 + const response2 = await fetch('/', { + method: 'post', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'x-xsrf-token': requestBody.token + } + }) + const body2 = await response2.json() + + assert.equal(response1.status, 200) + assert.equal(response2.status, 200) + assert.equal(body1.message, 'hello') + assert.equal(body2.message, 'hello') + }) +}) diff --git a/tests/signedCookie.spec.ts b/tests/signedCookie.spec.ts deleted file mode 100644 index e7395b8..0000000 --- a/tests/signedCookie.spec.ts +++ /dev/null @@ -1,234 +0,0 @@ -import { suite } from 'uvu' -import * as assert from 'uvu/assert' -import type { CSRFOptions } from '../src/index' -import { initApp } from './helper' - -const output = suite('signed cookie - output') - -output('should output a csrf token', async () => { - const { fetch } = initApp({ middleware: 'signedCookie' }) - - const response = await fetch('/') - const body = await response.json() - - assert.is(response.status, 200) - assert.ok(response.headers.has('set-cookie')) - assert.ok(response.headers.get('set-cookie').startsWith('_csrf=s%3A')) - assert.type(body.token, 'string') -}) - -output('should output a csrf token with given options (different salt & secret length)', async () => { - const options: CSRFOptions = { - saltLength: 10, - secretLength: 30, - cookie: { - signed: true - } - } - const { fetch } = initApp({ middleware: 'signedCookie', options }) - - const response = await fetch('/') - const body = await response.json() - - const [salt, _] = body.token.split('-') - assert.is(response.status, 200) - assert.is(salt.length, 10) -}) - -output('should output a csrf token with given options (different cookie path)', async () => { - const options: CSRFOptions = { - cookie: { - signed: true, - path: '/admin', - key: 'virus' - } - } - const { fetch } = initApp({ middleware: 'signedCookie', options }) - - const response = await fetch('/') - const body = await response.json() - - const [token, path] = response.headers.get('set-cookie').split(' ') - - assert.is(response.status, 200) - assert.ok(response.headers.has('set-cookie')) - assert.ok(token.startsWith('virus')) - assert.is(path.split('Path=')[1], '/admin') - assert.type(body.token, 'string') -}) - -output.run() - -const body = suite('signed cookie - req.body') - -body('should be able to pass through req.body', async () => { - const { fetch } = initApp({ middleware: 'signedCookie', parser: 'json' }) - const request = await fetch('/') - const requestBody = await request.json() - - const response = await fetch('/', { - method: 'post', - body: JSON.stringify({ _csrf: requestBody.token }), - headers: { - cookie: request.headers.get('set-cookie'), - 'content-type': 'application/json' - } - }) - const body = await response.json() - - assert.is(response.status, 200) - assert.is(body.message, 'hello') -}) - -body('should not be able to pass through req.body', async () => { - const { fetch } = initApp({ middleware: 'signedCookie', parser: 'json' }) - const request = await fetch('/') - - const response = await fetch('/', { - method: 'post', - body: JSON.stringify({}), - headers: { - cookie: request.headers.get('set-cookie'), - 'content-type': 'application/json' - } - }) - const body = await response.text() - - assert.is(response.status, 403) - assert.is(body, 'invalid csrf token') -}) - -body.run() - -const query = suite('signed cookie - req.query') - -query('should be able to pass through query', async () => { - const { fetch } = initApp({ middleware: 'signedCookie' }) - const request = await fetch('/') - const requestBody = await request.json() - - const response = await fetch(`/?_csrf=${encodeURIComponent(requestBody.token)}`, { - method: 'post', - headers: { - cookie: request.headers.get('set-cookie'), - 'content-type': 'application/x-www-form-urlencoded' - } - }) - const body = await response.json() - - assert.is(response.status, 200) - assert.is(body.message, 'hello') -}) - -query.run() - -const header = suite('signed cookie - req.headers') - -header('should be able to pass through headers csrf-token', async () => { - const { fetch } = initApp({ middleware: 'signedCookie' }) - const request = await fetch('/') - const requestBody = await request.json() - - const response = await fetch(`/`, { - method: 'post', - headers: { - cookie: request.headers.get('set-cookie'), - 'csrf-token': requestBody.token - } - }) - const body = await response.json() - - assert.is(response.status, 200) - assert.is(body.message, 'hello') -}) - -header('should be able to pass through headers xsrf-token', async () => { - const { fetch } = initApp({ middleware: 'signedCookie' }) - const request = await fetch('/') - const requestBody = await request.json() - - const response = await fetch(`/`, { - method: 'post', - headers: { - cookie: request.headers.get('set-cookie'), - 'xsrf-token': requestBody.token - } - }) - const body = await response.json() - - assert.is(response.status, 200) - assert.is(body.message, 'hello') -}) - -header('should be able to pass through headers x-csrf-token', async () => { - const { fetch } = initApp({ middleware: 'signedCookie' }) - const request = await fetch('/') - const requestBody = await request.json() - - const response = await fetch(`/`, { - method: 'post', - headers: { - cookie: request.headers.get('set-cookie'), - 'x-csrf-token': requestBody.token - } - }) - const body = await response.json() - - assert.is(response.status, 200) - assert.is(body.message, 'hello') -}) - -header('should be able to pass through headers x-xsrf-token', async () => { - const { fetch } = initApp({ middleware: 'signedCookie' }) - const request = await fetch('/') - const requestBody = await request.json() - - const response = await fetch(`/`, { - method: 'post', - headers: { - cookie: request.headers.get('set-cookie'), - 'x-xsrf-token': requestBody.token - } - }) - const body = await response.json() - - assert.is(response.status, 200) - assert.is(body.message, 'hello') -}) - -header.run() - -const reusable = suite('reusable token') - -reusable('a', async () => { - const { fetch } = initApp({ middleware: 'signedCookie' }) - const request = await fetch('/') - const requestBody = await request.json() - - // response #1 - const response1 = await fetch(`/`, { - method: 'post', - headers: { - cookie: request.headers.get('set-cookie'), - 'x-xsrf-token': requestBody.token - } - }) - const body1 = await response1.json() - - // response #2 - const response2 = await fetch(`/`, { - method: 'post', - headers: { - cookie: request.headers.get('set-cookie'), - 'x-xsrf-token': requestBody.token - } - }) - const body2 = await response2.json() - - assert.is(response1.status, 200) - assert.is(response2.status, 200) - assert.equal(body1.message, 'hello') - assert.equal(body2.message, 'hello') -}) - -reusable.run() diff --git a/tests/signedCookie.test.ts b/tests/signedCookie.test.ts new file mode 100644 index 0000000..bce71dc --- /dev/null +++ b/tests/signedCookie.test.ts @@ -0,0 +1,257 @@ +import { assert, describe, it } from 'vitest' +import { onTestFinished } from 'vitest' +import type { CSRFOptions } from '../src/index' +import { initApp } from './helper' + +describe('signed cookie - output', () => { + it('should output a csrf token', async () => { + const { fetch, server } = initApp({ middleware: 'signedCookie' }) + onTestFinished(() => { + server.close() + }) + + const response = await fetch('/') + const body = await response.json() + + assert.equal(response.status, 200) + assert.ok(response.headers.has('set-cookie')) + assert.ok(response.headers.get('set-cookie')?.startsWith('_csrf=s%3A')) + assert.typeOf(body.token, 'string') + }) + + it('should output a csrf token with given options (different salt & secret length)', async () => { + const options: CSRFOptions = { + saltLength: 10, + secretLength: 30, + cookie: { + signed: true + } + } + const { fetch, server } = initApp({ middleware: 'signedCookie', options }) + onTestFinished(() => { + server.close() + }) + + const response = await fetch('/') + const body = await response.json() + + const [salt, _] = body.token.split('-') + assert.equal(response.status, 200) + assert.equal(salt.length, 10) + }) + + it('should output a csrf token with given options (different cookie path)', async () => { + const options: CSRFOptions = { + cookie: { + signed: true, + path: '/admin', + key: 'virus' + } + } + const { fetch, server } = initApp({ middleware: 'signedCookie', options }) + onTestFinished(() => { + server.close() + }) + + const response = await fetch('/') + const body = await response.json() + + const [token, path] = response.headers.get('set-cookie')?.split(' ') ?? ['', ''] + + assert.equal(response.status, 200) + assert.ok(response.headers.has('set-cookie')) + assert.ok(token.startsWith('virus')) + assert.equal(path.split('Path=')[1], '/admin') + assert.typeOf(body.token, 'string') + }) +}) + +describe('signed cookie - req.body', () => { + it('should be able to pass through req.body', async () => { + const { fetch, server } = initApp({ middleware: 'signedCookie', parser: 'json' }) + onTestFinished(() => { + server.close() + }) + const request = await fetch('/') + const requestBody = await request.json() + + const response = await fetch('/', { + method: 'post', + body: JSON.stringify({ _csrf: requestBody.token }), + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'content-type': 'application/json' + } + }) + const body = await response.json() + + assert.equal(response.status, 200) + assert.equal(body.message, 'hello') + }) + + it('should not be able to pass through req.body', async () => { + const { fetch, server } = initApp({ middleware: 'signedCookie', parser: 'json' }) + onTestFinished(() => { + server.close() + }) + const request = await fetch('/') + + const response = await fetch('/', { + method: 'post', + body: JSON.stringify({}), + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'content-type': 'application/json' + } + }) + const body = await response.text() + + assert.equal(response.status, 403) + assert.equal(body, 'invalid csrf token') + }) +}) + +describe('signed cookie - req.query', () => { + it('should be able to pass through query', async () => { + const { fetch, server } = initApp({ middleware: 'signedCookie' }) + onTestFinished(() => { + server.close() + }) + const request = await fetch('/') + const requestBody = await request.json() + + const response = await fetch(`/?_csrf=${encodeURIComponent(requestBody.token)}`, { + method: 'post', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'content-type': 'application/x-www-form-urlencoded' + } + }) + const body = await response.json() + + assert.equal(response.status, 200) + assert.equal(body.message, 'hello') + }) +}) + +describe('signed cookie - req.headers', () => { + it('should be able to pass through headers csrf-token', async () => { + const { fetch, server } = initApp({ middleware: 'signedCookie' }) + onTestFinished(() => { + server.close() + }) + const request = await fetch('/') + const requestBody = await request.json() + + const response = await fetch('/', { + method: 'post', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'csrf-token': requestBody.token + } + }) + const body = await response.json() + + assert.equal(response.status, 200) + assert.equal(body.message, 'hello') + }) + + it('should be able to pass through headers xsrf-token', async () => { + const { fetch, server } = initApp({ middleware: 'signedCookie' }) + onTestFinished(() => { + server.close() + }) + const request = await fetch('/') + const requestBody = await request.json() + + const response = await fetch('/', { + method: 'post', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'xsrf-token': requestBody.token + } + }) + const body = await response.json() + + assert.equal(response.status, 200) + assert.equal(body.message, 'hello') + }) + + it('should be able to pass through headers x-csrf-token', async () => { + const { fetch, server } = initApp({ middleware: 'signedCookie' }) + onTestFinished(() => { + server.close() + }) + const request = await fetch('/') + const requestBody = await request.json() + + const response = await fetch('/', { + method: 'post', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'x-csrf-token': requestBody.token + } + }) + const body = await response.json() + + assert.equal(response.status, 200) + assert.equal(body.message, 'hello') + }) + + it('should be able to pass through headers x-xsrf-token', async () => { + const { fetch, server } = initApp({ middleware: 'signedCookie' }) + onTestFinished(() => { + server.close() + }) + const request = await fetch('/') + const requestBody = await request.json() + + const response = await fetch('/', { + method: 'post', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'x-xsrf-token': requestBody.token + } + }) + const body = await response.json() + + assert.equal(response.status, 200) + assert.equal(body.message, 'hello') + }) +}) + +describe('reusable token', () => { + it('a', async () => { + const { fetch, server } = initApp({ middleware: 'signedCookie' }) + onTestFinished(() => { + server.close() + }) + const request = await fetch('/') + const requestBody = await request.json() + + // response #1 + const response1 = await fetch('/', { + method: 'post', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'x-xsrf-token': requestBody.token + } + }) + const body1 = await response1.json() + + // response #2 + const response2 = await fetch('/', { + method: 'post', + headers: { + cookie: request.headers.get('set-cookie') ?? '', + 'x-xsrf-token': requestBody.token + } + }) + const body2 = await response2.json() + + assert.equal(response1.status, 200) + assert.equal(response2.status, 200) + assert.equal(body1.message, 'hello') + assert.equal(body2.message, 'hello') + }) +}) diff --git a/tests/utils.spec.ts b/tests/utils.spec.ts index 92bc5ce..11b5bae 100644 --- a/tests/utils.spec.ts +++ b/tests/utils.spec.ts @@ -1,27 +1,24 @@ -import { suite } from 'uvu' -import * as assert from 'uvu/assert' +import { assert, describe, it } from 'vitest' import { timeSafeCompare } from '../src/utils' -const tSC = suite('timeSafeCompare() test') +describe('timeSafeCompare() test', () => { + it('should return true for the same value', () => { + const value = 'qsLPe4XsiY2nxXvaD9fWsUXT65psYCoE' + const result = timeSafeCompare(value, value) + assert.equal(result, true) + }) -tSC('should return true for the same value', () => { - const value = 'qsLPe4XsiY2nxXvaD9fWsUXT65psYCoE' - const result = timeSafeCompare(value, value) - assert.is(result, true) -}) - -tSC('should return false without failing', () => { - const valueA = 'qsLPe4XsiY2nxXvaD9fWsUXT65psYCoE' - const valueB = 'R9qyjzGA8b6xz25kGQTBph65Na3WW57j' - const result = timeSafeCompare(valueA, valueB) - assert.is(result, false) -}) + it('should return false without failing', () => { + const valueA = 'qsLPe4XsiY2nxXvaD9fWsUXT65psYCoE' + const valueB = 'R9qyjzGA8b6xz25kGQTBph65Na3WW57j' + const result = timeSafeCompare(valueA, valueB) + assert.equal(result, false) + }) -tSC('should return false without failing', () => { - const valueA = 'R9qyjzGA8b6xz25kG' - const valueB = 'XsiY2nxXvaD9fWsUXT65psYCoE' - const result = timeSafeCompare(valueA, valueB) - assert.is(result, false) + it('should return false without failing', () => { + const valueA = 'R9qyjzGA8b6xz25kG' + const valueB = 'XsiY2nxXvaD9fWsUXT65psYCoE' + const result = timeSafeCompare(valueA, valueB) + assert.equal(result, false) + }) }) - -tSC.run() diff --git a/tsconfig.json b/tsconfig.json index cc5cb5d..f9e3d39 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,5 +19,5 @@ "forceConsistentCasingInFileNames": true, "allowSyntheticDefaultImports": true }, - "exclude": ["tests", "examples", "dist"] + "exclude": ["tests", "examples", "dist", "vitest.config.ts"] } diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..9531927 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + environment: 'node', + coverage: { + provider: 'v8', + reporter: ['lcov'], + include: ['src'] + } + } +}) From 3a4bab881e880a18b8084f8d4bb4b4d2ba251b39 Mon Sep 17 00:00:00 2001 From: Reinaldy Rafli Date: Mon, 16 Sep 2024 07:22:24 +0700 Subject: [PATCH 2/4] chore: better internal typings --- src/index.ts | 41 +++++++++++++++++++++++++++++++++-------- tests/failing.test.ts | 26 +++++++++++++++++++++++--- tests/helper.ts | 2 +- vitest.config.ts | 2 +- 4 files changed, 58 insertions(+), 13 deletions(-) diff --git a/src/index.ts b/src/index.ts index d5e7a08..1ccdd83 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,8 +7,8 @@ import { Tokens } from './token' export interface CSRFRequest extends IncomingMessage { csrfToken(): string secret?: string | string[] - signedCookies?: any - cookies?: any + signedCookies?: unknown + cookies?: unknown query?: ParsedUrlQuery body?: any } @@ -81,7 +81,7 @@ export function csrf(opts: CSRFOptions = {}): (req: CSRFRequest, res: ServerResp throw new Error('misconfigured csrf') } - let secret = getSecret(req, options.sessionKey, options.cookie, options.middleware) + let secret: string | undefined = getSecret(req, options.sessionKey, options.cookie, options.middleware) let token: string req.csrfToken = (): string => { @@ -137,11 +137,26 @@ function verifyConfiguration( return true } -function getSecret(req: CSRFRequest, sessionKey: string, cookie: CookieOptions, middleware: MiddlewareOptions): string { - const bag = getSecretBag(req, sessionKey, cookie, middleware) +function getSecret( + req: CSRFRequest, + sessionKey: string, + cookie: CookieOptions, + middleware: MiddlewareOptions +): string | undefined { + const bag: Record | undefined = getSecretBag(req, sessionKey, cookie, middleware) const key = middleware === 'cookie' ? cookie.key : 'csrfSecret' - return bag[key] + return bag ? bag[key] : undefined +} + +function assertRecord(obj: unknown): obj is Record { + if (typeof obj !== 'object') return false + + if (Array.isArray(obj)) return false + + if (Object.getOwnPropertySymbols(obj).length > 0) return false + + return Object.getOwnPropertyNames(obj).every((prop) => typeof obj[prop] === 'string') } function getSecretBag( @@ -149,9 +164,19 @@ function getSecretBag( sessionKey: string, cookie: CookieOptions, middleware: MiddlewareOptions -): string { +): Record | undefined { if (middleware === 'cookie' && cookie) { - return cookie.signed ? req?.signedCookies : req?.cookies + if (cookie.signed) { + if (assertRecord(req?.signedCookies)) { + return req?.signedCookies + } + return undefined + } + + if (assertRecord(req?.cookies)) { + return req?.cookies + } + return undefined } return req[sessionKey] } diff --git a/tests/failing.test.ts b/tests/failing.test.ts index 755ebba..893b9b7 100644 --- a/tests/failing.test.ts +++ b/tests/failing.test.ts @@ -9,7 +9,7 @@ import type { CSRFRequest } from '../src/index' describe('failing - these should return error', () => { it('without a cookie parser', async () => { - const app = new App() + const app = new App() const csrfProtection = csrf({ cookie: { signed: false } }) app.use('/', urlencoded(), csrfProtection, (req, res) => { res.status(200).json({ token: req.csrfToken() }) @@ -29,7 +29,7 @@ describe('failing - these should return error', () => { }) it('signed but without a secret', async () => { - const app = new App() + const app = new App() app.use(cookieParser()) const csrfProtection = csrf({ cookie: { signed: true } }) app.use('/', urlencoded(), csrfProtection, (req, res) => { @@ -49,8 +49,28 @@ describe('failing - these should return error', () => { assert.equal(body, 'misconfigured csrf') }) + it('signed cookie without cookie parser', async () => { + const app = new App() + const csrfProtection = csrf({ cookie: { signed: true } }) + app.use('/', urlencoded(), csrfProtection, (req, res) => { + res.status(200).json({ token: req.csrfToken() }) + }) + const server = app.listen() + onTestFinished(() => { + server.close() + }) + + const fetch = makeFetch(server) + + const response = await fetch('/') + const body = await response.text() + + assert.equal(response.status, 500) + assert.equal(body, 'misconfigured csrf') + }) + it('session without the session middleware', async () => { - const app = new App() + const app = new App() const csrfProtection = csrf({ middleware: 'session' }) app.use('/', urlencoded(), csrfProtection, (req, res) => { res.status(200).json({ token: req.csrfToken() }) diff --git a/tests/helper.ts b/tests/helper.ts index 480f025..bc228fb 100644 --- a/tests/helper.ts +++ b/tests/helper.ts @@ -34,7 +34,7 @@ export function initApp({ parser, options = {}, middleware = 'cookie' }: initApp } else if (middleware === 'signedCookie') { app.use(cookieParser(secret)) } else if (middleware === 'session') { - // @ts-ignore + // @ts-expect-error testing purposes app.use(session({ secret, resave: false, saveUninitialized: false, name: 'session' })) } diff --git a/vitest.config.ts b/vitest.config.ts index 9531927..d60dc4d 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,7 +5,7 @@ export default defineConfig({ environment: 'node', coverage: { provider: 'v8', - reporter: ['lcov'], + reporter: ['lcov', 'text', 'json'], include: ['src'] } } From a07e8a59eff5df84e97bead3084aa9ff20b99773 Mon Sep 17 00:00:00 2001 From: Reinaldy Rafli Date: Mon, 16 Sep 2024 07:31:41 +0700 Subject: [PATCH 3/4] chore: remove 'any' from used types --- src/index.ts | 6 +++--- src/token.ts | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index 1ccdd83..018a3b7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,7 +10,7 @@ export interface CSRFRequest extends IncomingMessage { signedCookies?: unknown cookies?: unknown query?: ParsedUrlQuery - body?: any + body?: unknown } // HTTP Method according to MDN (https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods) @@ -26,7 +26,7 @@ export interface CSRFOptions { middleware?: MiddlewareOptions cookie?: CookieOptions sessionKey?: string - value?: (req: CSRFRequest | IncomingMessage) => any + value?: (req: CSRFRequest | IncomingMessage) => string | string[] ignoreMethod?: HTTPMethod[] saltLength?: number secretLength?: number @@ -111,7 +111,7 @@ export function csrf(opts: CSRFOptions = {}): (req: CSRFRequest, res: ServerResp function defaultValue(req: CSRFRequest): string | string[] { return ( - req.body?._csrf || + (assertRecord(req?.body) && req.body?._csrf) || req.query?._csrf || req.headers['csrf-token'] || req.headers['xsrf-token'] || diff --git a/src/token.ts b/src/token.ts index cee211d..8517ca5 100644 --- a/src/token.ts +++ b/src/token.ts @@ -28,13 +28,14 @@ export class Tokens { return typeSafeUID(this.secretLength) } - verify(secret: string, token: string): boolean { + verify(secret: string, token: string | string[]): boolean { + if (Array.isArray(token)) token = token.join('') const index = token?.indexOf('-') if (index === -1 || index === undefined) { return false } - const salt = token.substr(0, index) + const salt = token.slice(0, index) const expected = this.tokenize(secret, salt) return timeSafeCompare(token, expected) From f48978bcd0affb2c5294f1b9f240277ccf9b0fdd Mon Sep 17 00:00:00 2001 From: Reinaldy Rafli Date: Sun, 22 Sep 2024 18:20:49 +0700 Subject: [PATCH 4/4] chore: refactor types to use Record directly --- src/index.ts | 28 ++++++---------------------- 1 file changed, 6 insertions(+), 22 deletions(-) diff --git a/src/index.ts b/src/index.ts index 018a3b7..81e14fb 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,10 +7,10 @@ import { Tokens } from './token' export interface CSRFRequest extends IncomingMessage { csrfToken(): string secret?: string | string[] - signedCookies?: unknown - cookies?: unknown + signedCookies?: Record + cookies?: Record query?: ParsedUrlQuery - body?: unknown + body?: Record } // HTTP Method according to MDN (https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods) @@ -111,7 +111,7 @@ export function csrf(opts: CSRFOptions = {}): (req: CSRFRequest, res: ServerResp function defaultValue(req: CSRFRequest): string | string[] { return ( - (assertRecord(req?.body) && req.body?._csrf) || + (req?.body?._csrf as string) || req.query?._csrf || req.headers['csrf-token'] || req.headers['xsrf-token'] || @@ -149,16 +149,6 @@ function getSecret( return bag ? bag[key] : undefined } -function assertRecord(obj: unknown): obj is Record { - if (typeof obj !== 'object') return false - - if (Array.isArray(obj)) return false - - if (Object.getOwnPropertySymbols(obj).length > 0) return false - - return Object.getOwnPropertyNames(obj).every((prop) => typeof obj[prop] === 'string') -} - function getSecretBag( req: CSRFRequest, sessionKey: string, @@ -167,16 +157,10 @@ function getSecretBag( ): Record | undefined { if (middleware === 'cookie' && cookie) { if (cookie.signed) { - if (assertRecord(req?.signedCookies)) { - return req?.signedCookies - } - return undefined + return req?.signedCookies } - if (assertRecord(req?.cookies)) { - return req?.cookies - } - return undefined + return req?.cookies } return req[sessionKey] }