From 8bdd0ab4cf7c23808d51678ca4671d9b34b95f7f Mon Sep 17 00:00:00 2001 From: Edoardo Dusi Date: Wed, 13 Nov 2024 16:49:36 +0100 Subject: [PATCH] chore: update eslint, using our shared conf, and update every dev deps (#866) * chore: update eslint, using our shared conf, and update every dev deps * chore: remove husky, add commitlint action, remove prettier, update node version in actions --- .github/dependabot.yml | 20 +- .github/workflows/build.yml | 19 +- .github/workflows/commitlint.yml | 27 + .github/workflows/lint.yml | 26 + .github/workflows/pkg.pr.new.yml | 10 +- .github/workflows/release.yml | 6 +- .github/workflows/test.yml | 9 +- .husky/commit-msg | 4 - .npmrc | 2 + eslint.config.mjs | 11 + package.json | 118 +- playground/vanilla/src/main.ts | 7 +- pnpm-lock.yaml | 3206 +++++++++++++++++++++++------- src/constants.ts | 14 +- src/entry.esm.ts | 16 +- src/entry.umd.ts | 22 +- src/index.test.ts | 332 ++-- src/index.ts | 585 +++--- src/interfaces.ts | 496 ++--- src/richTextResolver.ts | 372 ++-- src/sbFetch.test.ts | 117 +- src/sbFetch.ts | 171 +- src/sbHelpers.test.ts | 164 +- src/sbHelpers.ts | 122 +- src/schema.ts | 177 +- src/throttlePromise.ts | 119 +- tests/api/index.e2e.ts | 2 +- vitest.config.ts | 2 +- 28 files changed, 3959 insertions(+), 2217 deletions(-) create mode 100644 .github/workflows/commitlint.yml create mode 100644 .github/workflows/lint.yml delete mode 100755 .husky/commit-msg create mode 100644 eslint.config.mjs diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9841a2f9..be742c9a 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,23 +5,23 @@ version: 2 updates: - - package-ecosystem: "pip" - directory: "/" + - package-ecosystem: pip + directory: / schedule: - interval: "daily" + interval: daily # Raise pull requests for version updates # to pip against the `develop` branch - target-branch: "fix/update-package-json-INT-122" + target-branch: fix/update-package-json-INT-122 # Labels on pull requests for version updates only labels: - - "pip dependencies" + - pip dependencies - - package-ecosystem: "npm" - directory: "/" + - package-ecosystem: npm + directory: / schedule: - interval: "weekly" + interval: weekly # Check for npm updates on Sundays - day: "sunday" + day: sunday # Labels on pull requests for security and version updates labels: - - "npm dependencies" + - npm dependencies diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5eaad02e..a870d5c7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,23 +6,28 @@ on: pull_request: branches: [main] +env: + PNPM_CACHE_FOLDER: .pnpm-store + HUSKY: 0 # Bypass husky commit hook for CI + jobs: test: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 + strategy: + matrix: + node-version: [20] environment: test steps: - name: Checkout uses: actions/checkout@v4 - name: Setup pnpm uses: pnpm/action-setup@v4 - - name: Use Node.js 18 + - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: - node-version: 18 + node-version: ${{ matrix.node-version }} cache: pnpm - name: Install dependencies run: pnpm install - - run: pnpm run lint - - run: pnpm run prettier . --check - - - run: pnpm run build + - name: Build + - run: pnpm build diff --git a/.github/workflows/commitlint.yml b/.github/workflows/commitlint.yml new file mode 100644 index 00000000..39f00d24 --- /dev/null +++ b/.github/workflows/commitlint.yml @@ -0,0 +1,27 @@ +name: CI + +on: [push, pull_request] + +jobs: + commitlint: + runs-on: ubuntu-24.04 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Setup pnpm + uses: pnpm/action-setup@v4 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: pnpm + - name: Install dependencies + run: pnpm install + - name: Validate current commit (last commit) with commitlint + if: github.event_name == 'push' + run: pnpm commitlint --last --verbose + - name: Validate PR commits with commitlint + if: github.event_name == 'pull_request' + run: pnpm commitlint --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }} --verbose diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..4588f051 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,26 @@ +name: Run linters +on: [push] +env: + PNPM_CACHE_FOLDER: .pnpm-store + HUSKY: 0 # Bypass husky commit hook for CI +jobs: + lint: + name: Lint + runs-on: ubuntu-24.04 + strategy: + matrix: + node-version: [20] + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup pnpm + uses: pnpm/action-setup@v4 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: pnpm + - name: Install dependencies + run: pnpm install + - name: Run Lint + run: pnpm run lint \ No newline at end of file diff --git a/.github/workflows/pkg.pr.new.yml b/.github/workflows/pkg.pr.new.yml index 3c271a7a..0eef07bd 100644 --- a/.github/workflows/pkg.pr.new.yml +++ b/.github/workflows/pkg.pr.new.yml @@ -5,28 +5,26 @@ on: - '**' tags: - '!**' - env: PNPM_CACHE_FOLDER: .pnpm-store HUSKY: 0 # Bypass husky commit hook for CI - permissions: {} - concurrency: group: ${{ github.workflow }}-${{ github.event.number }} cancel-in-progress: true - jobs: build: runs-on: ubuntu-latest + strategy: + matrix: + node-version: [20] steps: - name: Checkout code uses: actions/checkout@v4 - - run: corepack enable - uses: actions/setup-node@v4 with: - node-version: 18 + node-version: ${{ matrix.node-version }} cache: pnpm - name: Install dependencies run: pnpm install diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5e7ee3c3..f34f4022 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,9 +1,5 @@ name: Release CI -# env: -# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -# NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - on: push: branches: [main, next, beta] @@ -29,4 +25,4 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - run: npx semantic-release@22.0.12 + run: npx semantic-release@24.2.0 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 938362f5..fbae8e5e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,17 +8,20 @@ env: jobs: test: name: Tests - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 + strategy: + matrix: + node-version: [20] environment: test steps: - name: Checkout uses: actions/checkout@v4 - name: Setup pnpm uses: pnpm/action-setup@v4 - - name: Use Node.js 18 + - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: - node-version: 18 + node-version: ${{ matrix.node-version }} cache: pnpm - name: Install dependencies run: pnpm install diff --git a/.husky/commit-msg b/.husky/commit-msg deleted file mode 100755 index fa859b0d..00000000 --- a/.husky/commit-msg +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -npx --no -- commitlint --edit "" diff --git a/.npmrc b/.npmrc index 214c29d1..7e18b6c1 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,3 @@ registry=https://registry.npmjs.org/ +public-hoist-pattern[]=@commitlint* +public-hoist-pattern[]=commitlint diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..dfd4fd0a --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,11 @@ +import { storyblokLintConfig } from '@storyblok/eslint-config'; + +export default storyblokLintConfig({ + rules: { + // @TODO: remove all of them after fixing and proper testing in v7 + '@typescript-eslint/no-this-alias': 'off', + 'ts/no-this-alias': 'off', + 'no-async-promise-executor': 'off', + }, + ignores: ['**/node_modules/**', 'playground', 'README.md'], +}); diff --git a/package.json b/package.json index 84518668..a4b0d608 100644 --- a/package.json +++ b/package.json @@ -1,38 +1,47 @@ { "name": "storyblok-js-client", - "module": "./dist/index.mjs", - "version": "5.0.0", - "packageManager": "pnpm@9.1.4", + "version": "6.10.1", + "packageManager": "pnpm@9.12.3", "description": "Universal JavaScript SDK for Storyblok's API", + "author": "Alexander Feiglstorfer ", "license": "MIT", + "homepage": "https://github.com/storyblok/storyblok-js-client#readme", + "repository": { + "type": "git", + "url": "https://github.com/storyblok/storyblok-js-client.git" + }, + "bugs": { + "url": "https://github.com/storyblok/storyblok-js-client/issues" + }, "keywords": [ "storyblok", "javascript", "api" ], "sideEffects": false, - "types": "./dist/types/entry.esm.d.ts", - "main": "./dist/index.umd.js", - "unpkg": "./dist/index.umd.js", - "jsdelivr": "./dist/index.umd.js", - "source": "src/index.ts", "exports": { ".": { + "types": "./dist/types/entry.esm.d.ts", "import": "./dist/index.mjs", - "require": "./dist/index.umd.js", - "types": "./dist/types/entry.esm.d.ts" + "require": "./dist/index.umd.js" }, "./richTextResolver": { + "types": "./dist/types/richTextResolver.d.ts", "import": "./dist/richTextResolver.mjs", - "require": "./dist/richTextResolver.umd.js", - "types": "./dist/types/richTextResolver.d.ts" + "require": "./dist/richTextResolver.umd.js" }, "./schema": { + "types": "./dist/types/schema.d.ts", "import": "./dist/schema.mjs", - "require": "./dist/schema.umd.js", - "types": "./dist/types/schema.d.ts" + "require": "./dist/schema.umd.js" } }, + "main": "./dist/index.umd.js", + "module": "./dist/index.mjs", + "unpkg": "./dist/index.umd.js", + "jsdelivr": "./dist/index.umd.js", + "types": "./dist/types/entry.esm.d.ts", + "source": "src/index.ts", "files": [ "dist", "src", @@ -40,7 +49,6 @@ ], "scripts": { "lint": "eslint --max-warnings=0 './src/**/*.{ts,js}'", - "prettier": "prettier . --write", "build": "node vite.build.mjs && tsc", "demo": "vite serve playground", "dev:umd": "npx serve ./", @@ -50,34 +58,25 @@ "coverage": "vitest run --coverage", "prepare": "npm run build" }, - "repository": { - "type": "git", - "url": "https://github.com/storyblok/storyblok-js-client.git" - }, - "author": "Alexander Feiglstorfer ", - "bugs": { - "url": "https://github.com/storyblok/storyblok-js-client/issues" - }, - "homepage": "https://github.com/storyblok/storyblok-js-client#readme", "devDependencies": { - "@commitlint/cli": "^18.4.3", - "@commitlint/config-conventional": "^18.4.3", - "@tsconfig/recommended": "^1.0.7", - "@typescript-eslint/eslint-plugin": "^6.12.0", - "@typescript-eslint/parser": "^6.12.0", - "@vitest/coverage-v8": "^2.0.5", - "@vitest/ui": "^2.0.5", - "eslint": "^8.54.0", - "eslint-config-prettier": "^9.0.0", - "husky": "^9.1.5", + "@commitlint/cli": "^19.5.0", + "@commitlint/config-conventional": "^19.5.0", + "@storyblok/eslint-config": "^0.3.0", + "@tsconfig/recommended": "^1.0.8", + "@typescript-eslint/eslint-plugin": "^8.14.0", + "@typescript-eslint/parser": "^8.14.0", + "@vitest/coverage-v8": "^2.1.4", + "@vitest/ui": "^2.1.4", + "eslint": "^9.14.0", + "eslint-config-prettier": "^9.1.0", "isomorphic-fetch": "^3.0.0", "kolorist": "^1.8.0", "prettier": "^3.3.3", - "typescript": "^5.5.4", - "vite": "^5.4.2", - "vite-plugin-banner": "^0.7.1", - "vite-plugin-dts": "^4.0.3", - "vitest": "^2.0.5" + "typescript": "^5.6.3", + "vite": "^5.4.11", + "vite-plugin-banner": "^0.8.0", + "vite-plugin-dts": "^4.3.0", + "vitest": "^2.1.4" }, "release": { "branches": [ @@ -95,50 +94,9 @@ "publishConfig": { "access": "public" }, - "lint-staged": { - "*.{js,jsx,css,ts,tsx}": [ - "prettier --write", - "eslint" - ], - "*.md": [ - "prettier --write" - ] - }, "commitlint": { "extends": [ "@commitlint/config-conventional" ] - }, - "eslintConfig": { - "env": { - "browser": true, - "es2021": true, - "node": true - }, - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "prettier" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": "latest", - "sourceType": "module" - }, - "plugins": [ - "@typescript-eslint" - ], - "rules": { - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-var-requires": 1, - "no-async-promise-executor": 0, - "no-undef": 0 - } - }, - "prettier": { - "semi": false, - "singleQuote": true, - "tabWidth": 2, - "trailingComma": "es5" } } diff --git a/playground/vanilla/src/main.ts b/playground/vanilla/src/main.ts index ceb36e74..b60146d8 100644 --- a/playground/vanilla/src/main.ts +++ b/playground/vanilla/src/main.ts @@ -5,7 +5,7 @@ import './style.css' const headers = new Headers() headers.append('Awiwi', 'Awiwi') const headers2 = { - 'Awiwi': 'Awiwi' + Awiwi: 'Awiwi', } console.log(headers2.constructor.name) // 2. Initialize the client with the preview token @@ -21,7 +21,7 @@ try { resolve_relations: 'root.author', }) const resolver = new RichTextResolver() - + const paragraph = { type: 'paragraph', content: [ @@ -34,7 +34,6 @@ try { } const html = resolver.render(paragraph, {}, false) - document.querySelector('#app')!.innerHTML = `
@@ -46,5 +45,3 @@ try {
 } catch (error) {
   console.error(error)
 }
-
-
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index b0945183..2498fc1e 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -9,35 +9,35 @@ importers:
   .:
     devDependencies:
       '@commitlint/cli':
-        specifier: ^18.4.3
-        version: 18.6.1(@types/node@22.4.2)(typescript@5.5.4)
+        specifier: ^19.5.0
+        version: 19.5.0(@types/node@22.4.2)(typescript@5.6.3)
       '@commitlint/config-conventional':
-        specifier: ^18.4.3
-        version: 18.6.3
+        specifier: ^19.5.0
+        version: 19.5.0
+      '@storyblok/eslint-config':
+        specifier: ^0.3.0
+        version: 0.3.0(@typescript-eslint/utils@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(@vue/compiler-sfc@3.5.12)(eslint-plugin-react-hooks@4.6.2(eslint@9.14.0(jiti@1.21.6)))(eslint@9.14.0(jiti@1.21.6))(svelte@4.2.18)(typescript@5.6.3)(vitest@2.1.4)
       '@tsconfig/recommended':
-        specifier: ^1.0.7
-        version: 1.0.7
+        specifier: ^1.0.8
+        version: 1.0.8
       '@typescript-eslint/eslint-plugin':
-        specifier: ^6.12.0
-        version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)
+        specifier: ^8.14.0
+        version: 8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)
       '@typescript-eslint/parser':
-        specifier: ^6.12.0
-        version: 6.21.0(eslint@8.57.0)(typescript@5.5.4)
+        specifier: ^8.14.0
+        version: 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)
       '@vitest/coverage-v8':
-        specifier: ^2.0.5
-        version: 2.0.5(vitest@2.0.5(@types/node@22.4.2)(@vitest/ui@2.0.5))
+        specifier: ^2.1.4
+        version: 2.1.4(vitest@2.1.4)
       '@vitest/ui':
-        specifier: ^2.0.5
-        version: 2.0.5(vitest@2.0.5)
+        specifier: ^2.1.4
+        version: 2.1.4(vitest@2.1.4)
       eslint:
-        specifier: ^8.54.0
-        version: 8.57.0
+        specifier: ^9.14.0
+        version: 9.14.0(jiti@1.21.6)
       eslint-config-prettier:
-        specifier: ^9.0.0
-        version: 9.1.0(eslint@8.57.0)
-      husky:
-        specifier: ^9.1.5
-        version: 9.1.5
+        specifier: ^9.1.0
+        version: 9.1.0(eslint@9.14.0(jiti@1.21.6))
       isomorphic-fetch:
         specifier: ^3.0.0
         version: 3.0.0
@@ -48,20 +48,20 @@ importers:
         specifier: ^3.3.3
         version: 3.3.3
       typescript:
-        specifier: ^5.5.4
-        version: 5.5.4
+        specifier: ^5.6.3
+        version: 5.6.3
       vite:
-        specifier: ^5.4.2
-        version: 5.4.2(@types/node@22.4.2)
+        specifier: ^5.4.11
+        version: 5.4.11(@types/node@22.4.2)
       vite-plugin-banner:
-        specifier: ^0.7.1
-        version: 0.7.1
+        specifier: ^0.8.0
+        version: 0.8.0
       vite-plugin-dts:
-        specifier: ^4.0.3
-        version: 4.0.3(@types/node@22.4.2)(rollup@4.21.0)(typescript@5.5.4)(vite@5.4.2(@types/node@22.4.2))
+        specifier: ^4.3.0
+        version: 4.3.0(@types/node@22.4.2)(rollup@4.21.0)(typescript@5.6.3)(vite@5.4.11(@types/node@22.4.2))
       vitest:
-        specifier: ^2.0.5
-        version: 2.0.5(@types/node@22.4.2)(@vitest/ui@2.0.5)
+        specifier: ^2.1.4
+        version: 2.1.4(@types/node@22.4.2)(@vitest/ui@2.1.4)
 
   playground/nextjs:
     devDependencies:
@@ -73,7 +73,7 @@ importers:
         version: 8.55.0
       eslint-config-next:
         specifier: 14.0.4
-        version: 14.0.4(eslint@8.55.0)(typescript@5.5.4)
+        version: 14.0.4(eslint@8.55.0)(typescript@5.6.3)
       next:
         specifier: ^13.4.2
         version: 13.5.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -131,6 +131,58 @@ packages:
     resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
     engines: {node: '>=6.0.0'}
 
+  '@antfu/eslint-config@3.6.2':
+    resolution: {integrity: sha512-cewFaIEuSSOjbIsNts8gjeMLQrrMDhZjZJHMWk+OyVGJLHRE09JiF5Yg5+XjMVYlG/7fPqeuwEehLrer+8zMfA==}
+    hasBin: true
+    peerDependencies:
+      '@eslint-react/eslint-plugin': ^1.5.8
+      '@prettier/plugin-xml': ^3.4.1
+      '@unocss/eslint-plugin': '>=0.50.0'
+      astro-eslint-parser: ^1.0.2
+      eslint: ^9.10.0
+      eslint-plugin-astro: ^1.2.0
+      eslint-plugin-format: '>=0.1.0'
+      eslint-plugin-react-hooks: ^4.6.0
+      eslint-plugin-react-refresh: ^0.4.4
+      eslint-plugin-solid: ^0.14.3
+      eslint-plugin-svelte: '>=2.35.1'
+      prettier-plugin-astro: ^0.13.0
+      prettier-plugin-slidev: ^1.0.5
+      svelte-eslint-parser: '>=0.37.0'
+    peerDependenciesMeta:
+      '@eslint-react/eslint-plugin':
+        optional: true
+      '@prettier/plugin-xml':
+        optional: true
+      '@unocss/eslint-plugin':
+        optional: true
+      astro-eslint-parser:
+        optional: true
+      eslint-plugin-astro:
+        optional: true
+      eslint-plugin-format:
+        optional: true
+      eslint-plugin-react-hooks:
+        optional: true
+      eslint-plugin-react-refresh:
+        optional: true
+      eslint-plugin-solid:
+        optional: true
+      eslint-plugin-svelte:
+        optional: true
+      prettier-plugin-astro:
+        optional: true
+      prettier-plugin-slidev:
+        optional: true
+      svelte-eslint-parser:
+        optional: true
+
+  '@antfu/install-pkg@0.4.1':
+    resolution: {integrity: sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==}
+
+  '@antfu/utils@0.7.10':
+    resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==}
+
   '@babel/code-frame@7.24.6':
     resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==}
     engines: {node: '>=6.9.0'}
@@ -139,14 +191,18 @@ packages:
     resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-validator-identifier@7.24.6':
-    resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==}
+  '@babel/helper-string-parser@7.25.9':
+    resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
     engines: {node: '>=6.9.0'}
 
   '@babel/helper-validator-identifier@7.24.7':
     resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
     engines: {node: '>=6.9.0'}
 
+  '@babel/helper-validator-identifier@7.25.9':
+    resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
+    engines: {node: '>=6.9.0'}
+
   '@babel/highlight@7.24.6':
     resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==}
     engines: {node: '>=6.9.0'}
@@ -156,6 +212,11 @@ packages:
     engines: {node: '>=6.0.0'}
     hasBin: true
 
+  '@babel/parser@7.26.2':
+    resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==}
+    engines: {node: '>=6.0.0'}
+    hasBin: true
+
   '@babel/runtime@7.24.7':
     resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==}
     engines: {node: '>=6.9.0'}
@@ -164,78 +225,107 @@ packages:
     resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==}
     engines: {node: '>=6.9.0'}
 
+  '@babel/types@7.26.0':
+    resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==}
+    engines: {node: '>=6.9.0'}
+
   '@bcoe/v8-coverage@0.2.3':
     resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
 
-  '@commitlint/cli@18.6.1':
-    resolution: {integrity: sha512-5IDE0a+lWGdkOvKH892HHAZgbAjcj1mT5QrfA/SVbLJV/BbBMGyKN0W5mhgjekPJJwEQdVNvhl9PwUacY58Usw==}
+  '@clack/core@0.3.4':
+    resolution: {integrity: sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==}
+
+  '@clack/prompts@0.7.0':
+    resolution: {integrity: sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==}
+    bundledDependencies:
+      - is-unicode-supported
+
+  '@commitlint/cli@19.5.0':
+    resolution: {integrity: sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ==}
     engines: {node: '>=v18'}
     hasBin: true
 
-  '@commitlint/config-conventional@18.6.3':
-    resolution: {integrity: sha512-8ZrRHqF6je+TRaFoJVwszwnOXb/VeYrPmTwPhf0WxpzpGTcYy1p0SPyZ2eRn/sRi/obnWAcobtDAq6+gJQQNhQ==}
+  '@commitlint/config-conventional@19.5.0':
+    resolution: {integrity: sha512-OBhdtJyHNPryZKg0fFpZNOBM1ZDbntMvqMuSmpfyP86XSfwzGw4CaoYRG4RutUPg0BTK07VMRIkNJT6wi2zthg==}
     engines: {node: '>=v18'}
 
-  '@commitlint/config-validator@18.6.1':
-    resolution: {integrity: sha512-05uiToBVfPhepcQWE1ZQBR/Io3+tb3gEotZjnI4tTzzPk16NffN6YABgwFQCLmzZefbDcmwWqJWc2XT47q7Znw==}
+  '@commitlint/config-validator@19.5.0':
+    resolution: {integrity: sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==}
     engines: {node: '>=v18'}
 
-  '@commitlint/ensure@18.6.1':
-    resolution: {integrity: sha512-BPm6+SspyxQ7ZTsZwXc7TRQL5kh5YWt3euKmEIBZnocMFkJevqs3fbLRb8+8I/cfbVcAo4mxRlpTPfz8zX7SnQ==}
+  '@commitlint/ensure@19.5.0':
+    resolution: {integrity: sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==}
     engines: {node: '>=v18'}
 
-  '@commitlint/execute-rule@18.6.1':
-    resolution: {integrity: sha512-7s37a+iWyJiGUeMFF6qBlyZciUkF8odSAnHijbD36YDctLhGKoYltdvuJ/AFfRm6cBLRtRk9cCVPdsEFtt/2rg==}
+  '@commitlint/execute-rule@19.5.0':
+    resolution: {integrity: sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==}
     engines: {node: '>=v18'}
 
-  '@commitlint/format@18.6.1':
-    resolution: {integrity: sha512-K8mNcfU/JEFCharj2xVjxGSF+My+FbUHoqR+4GqPGrHNqXOGNio47ziiR4HQUPKtiNs05o8/WyLBoIpMVOP7wg==}
+  '@commitlint/format@19.5.0':
+    resolution: {integrity: sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==}
     engines: {node: '>=v18'}
 
-  '@commitlint/is-ignored@18.6.1':
-    resolution: {integrity: sha512-MOfJjkEJj/wOaPBw5jFjTtfnx72RGwqYIROABudOtJKW7isVjFe9j0t8xhceA02QebtYf4P/zea4HIwnXg8rvA==}
+  '@commitlint/is-ignored@19.5.0':
+    resolution: {integrity: sha512-0XQ7Llsf9iL/ANtwyZ6G0NGp5Y3EQ8eDQSxv/SRcfJ0awlBY4tHFAvwWbw66FVUaWICH7iE5en+FD9TQsokZ5w==}
     engines: {node: '>=v18'}
 
-  '@commitlint/lint@18.6.1':
-    resolution: {integrity: sha512-8WwIFo3jAuU+h1PkYe5SfnIOzp+TtBHpFr4S8oJWhu44IWKuVx6GOPux3+9H1iHOan/rGBaiacicZkMZuluhfQ==}
+  '@commitlint/lint@19.5.0':
+    resolution: {integrity: sha512-cAAQwJcRtiBxQWO0eprrAbOurtJz8U6MgYqLz+p9kLElirzSCc0vGMcyCaA1O7AqBuxo11l1XsY3FhOFowLAAg==}
     engines: {node: '>=v18'}
 
-  '@commitlint/load@18.6.1':
-    resolution: {integrity: sha512-p26x8734tSXUHoAw0ERIiHyW4RaI4Bj99D8YgUlVV9SedLf8hlWAfyIFhHRIhfPngLlCe0QYOdRKYFt8gy56TA==}
+  '@commitlint/load@19.5.0':
+    resolution: {integrity: sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA==}
     engines: {node: '>=v18'}
 
-  '@commitlint/message@18.6.1':
-    resolution: {integrity: sha512-VKC10UTMLcpVjMIaHHsY1KwhuTQtdIKPkIdVEwWV+YuzKkzhlI3aNy6oo1eAN6b/D2LTtZkJe2enHmX0corYRw==}
+  '@commitlint/message@19.5.0':
+    resolution: {integrity: sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==}
     engines: {node: '>=v18'}
 
-  '@commitlint/parse@18.6.1':
-    resolution: {integrity: sha512-eS/3GREtvVJqGZrwAGRwR9Gdno3YcZ6Xvuaa+vUF8j++wsmxrA2En3n0ccfVO2qVOLJC41ni7jSZhQiJpMPGOQ==}
+  '@commitlint/parse@19.5.0':
+    resolution: {integrity: sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==}
     engines: {node: '>=v18'}
 
-  '@commitlint/read@18.6.1':
-    resolution: {integrity: sha512-ia6ODaQFzXrVul07ffSgbZGFajpe8xhnDeLIprLeyfz3ivQU1dIoHp7yz0QIorZ6yuf4nlzg4ZUkluDrGN/J/w==}
+  '@commitlint/read@19.5.0':
+    resolution: {integrity: sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==}
     engines: {node: '>=v18'}
 
-  '@commitlint/resolve-extends@18.6.1':
-    resolution: {integrity: sha512-ifRAQtHwK+Gj3Bxj/5chhc4L2LIc3s30lpsyW67yyjsETR6ctHAHRu1FSpt0KqahK5xESqoJ92v6XxoDRtjwEQ==}
+  '@commitlint/resolve-extends@19.5.0':
+    resolution: {integrity: sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==}
     engines: {node: '>=v18'}
 
-  '@commitlint/rules@18.6.1':
-    resolution: {integrity: sha512-kguM6HxZDtz60v/zQYOe0voAtTdGybWXefA1iidjWYmyUUspO1zBPQEmJZ05/plIAqCVyNUTAiRPWIBKLCrGew==}
+  '@commitlint/rules@19.5.0':
+    resolution: {integrity: sha512-hDW5TPyf/h1/EufSHEKSp6Hs+YVsDMHazfJ2azIk9tHPXS6UqSz1dIRs1gpqS3eMXgtkT7JH6TW4IShdqOwhAw==}
     engines: {node: '>=v18'}
 
-  '@commitlint/to-lines@18.6.1':
-    resolution: {integrity: sha512-Gl+orGBxYSNphx1+83GYeNy5N0dQsHBQ9PJMriaLQDB51UQHCVLBT/HBdOx5VaYksivSf5Os55TLePbRLlW50Q==}
+  '@commitlint/to-lines@19.5.0':
+    resolution: {integrity: sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==}
     engines: {node: '>=v18'}
 
-  '@commitlint/top-level@18.6.1':
-    resolution: {integrity: sha512-HyiHQZUTf0+r0goTCDs/bbVv/LiiQ7AVtz6KIar+8ZrseB9+YJAIo8HQ2IC2QT1y3N1lbW6OqVEsTHjbT6hGSw==}
+  '@commitlint/top-level@19.5.0':
+    resolution: {integrity: sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==}
     engines: {node: '>=v18'}
 
-  '@commitlint/types@18.6.1':
-    resolution: {integrity: sha512-gwRLBLra/Dozj2OywopeuHj2ac26gjGkz2cZ+86cTJOdtWfiRRr4+e77ZDAGc6MDWxaWheI+mAV5TLWWRwqrFg==}
+  '@commitlint/types@19.5.0':
+    resolution: {integrity: sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==}
     engines: {node: '>=v18'}
 
+  '@dprint/formatter@0.3.0':
+    resolution: {integrity: sha512-N9fxCxbaBOrDkteSOzaCqwWjso5iAe+WJPsHC021JfHNj2ThInPNEF13ORDKta3llq5D1TlclODCvOvipH7bWQ==}
+
+  '@dprint/markdown@0.17.8':
+    resolution: {integrity: sha512-ukHFOg+RpG284aPdIg7iPrCYmMs3Dqy43S1ejybnwlJoFiW02b+6Bbr5cfZKFRYNP3dKGM86BqHEnMzBOyLvvA==}
+
+  '@dprint/toml@0.6.3':
+    resolution: {integrity: sha512-zQ42I53sb4WVHA+5yoY1t59Zk++Ot02AvUgtNKLzTT8mPyVqVChFcePa3on/xIoKEgH+RoepgPHzqfk9837YFw==}
+
+  '@es-joy/jsdoccomment@0.48.0':
+    resolution: {integrity: sha512-G6QUWIcC+KvSwXNsJyDTHvqUdNoAVJPPgkc3+Uk4WBKqZvoXhlvazOgm9aL0HwihJLQf0l+tOE2UFzXBqCqgDw==}
+    engines: {node: '>=16'}
+
+  '@es-joy/jsdoccomment@0.49.0':
+    resolution: {integrity: sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==}
+    engines: {node: '>=16'}
+
   '@esbuild/aix-ppc64@0.20.2':
     resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==}
     engines: {node: '>=12'}
@@ -512,27 +602,84 @@ packages:
     cpu: [x64]
     os: [win32]
 
+  '@eslint-community/eslint-plugin-eslint-comments@4.4.1':
+    resolution: {integrity: sha512-lb/Z/MzbTf7CaVYM9WCFNQZ4L1yi3ev2fsFPF99h31ljhSEyUoyEsKsNWiU+qD1glbYTDJdqgyaLKtyTkkqtuQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0
+
   '@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
 
+  '@eslint-community/eslint-utils@4.4.1':
+    resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
   '@eslint-community/regexpp@4.10.0':
     resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==}
     engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
 
+  '@eslint-community/regexpp@4.12.1':
+    resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
+    engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+  '@eslint/compat@1.2.2':
+    resolution: {integrity: sha512-jhgiIrsw+tRfcBQ4BFl2C3vCrIUw2trCY0cnDvGZpwTtKCEDmZhAtMfrEUP/KpnwM6PrO0T+Ltm+ccW74olG3Q==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^9.10.0
+    peerDependenciesMeta:
+      eslint:
+        optional: true
+
+  '@eslint/config-array@0.18.0':
+    resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/core@0.7.0':
+    resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   '@eslint/eslintrc@2.1.4':
     resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
 
+  '@eslint/eslintrc@3.1.0':
+    resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   '@eslint/js@8.55.0':
     resolution: {integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
 
-  '@eslint/js@8.57.0':
-    resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+  '@eslint/js@9.14.0':
+    resolution: {integrity: sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/markdown@6.2.1':
+    resolution: {integrity: sha512-cKVd110hG4ICHmWhIwZJfKmmJBvbiDWyrHODJknAtudKgZtlROGoLX9UEOA0o746zC0hCY4UV4vR+aOGW9S6JQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/object-schema@2.1.4':
+    resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/plugin-kit@0.2.2':
+    resolution: {integrity: sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@humanfs/core@0.19.1':
+    resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
+    engines: {node: '>=18.18.0'}
+
+  '@humanfs/node@0.16.6':
+    resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==}
+    engines: {node: '>=18.18.0'}
 
   '@humanwhocodes/config-array@0.11.14':
     resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
@@ -545,6 +692,14 @@ packages:
   '@humanwhocodes/object-schema@2.0.3':
     resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
 
+  '@humanwhocodes/retry@0.3.1':
+    resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
+    engines: {node: '>=18.18'}
+
+  '@humanwhocodes/retry@0.4.1':
+    resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==}
+    engines: {node: '>=18.18'}
+
   '@isaacs/cliui@8.0.2':
     resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
     engines: {node: '>=12'}
@@ -574,11 +729,11 @@ packages:
   '@jridgewell/trace-mapping@0.3.25':
     resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
 
-  '@microsoft/api-extractor-model@7.29.4':
-    resolution: {integrity: sha512-LHOMxmT8/tU1IiiiHOdHFF83Qsi+V8d0kLfscG4EvQE9cafiR8blOYr8SfkQKWB1wgEilQgXJX3MIA4vetDLZw==}
+  '@microsoft/api-extractor-model@7.29.8':
+    resolution: {integrity: sha512-t3Z/xcO6TRbMcnKGVMs4uMzv/gd5j0NhMiJIGjD4cJMeFJ1Hf8wnLSx37vxlRlL0GWlGJhnFgxvnaL6JlS+73g==}
 
-  '@microsoft/api-extractor@7.47.4':
-    resolution: {integrity: sha512-HKm+P4VNzWwvq1Ey+Jfhhj/3MjsD+ka2hbt8L5AcRM95lu1MFOYnz3XlU7Gr79Q/ZhOb7W/imAKeYrOI0bFydg==}
+  '@microsoft/api-extractor@7.47.11':
+    resolution: {integrity: sha512-lrudfbPub5wzBhymfFtgZKuBvXxoSIAdrvS2UbHjoMT2TjIEddq6Z13pcve7A03BAouw0x8sW8G4txdgfiSwpQ==}
     hasBin: true
 
   '@microsoft/tsdoc-config@0.17.0':
@@ -663,6 +818,10 @@ packages:
     resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
     engines: {node: '>=14'}
 
+  '@pkgr/core@0.1.1':
+    resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==}
+    engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+
   '@polka/url@1.0.0-next.25':
     resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==}
 
@@ -838,8 +997,8 @@ packages:
   '@rushstack/eslint-patch@1.10.3':
     resolution: {integrity: sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==}
 
-  '@rushstack/node-core-library@5.5.1':
-    resolution: {integrity: sha512-ZutW56qIzH8xIOlfyaLQJFx+8IBqdbVCZdnj+XT1MorQ1JqqxHse8vbCpEM+2MjsrqcbxcgDIbfggB1ZSQ2A3g==}
+  '@rushstack/node-core-library@5.9.0':
+    resolution: {integrity: sha512-MMsshEWkTbXqxqFxD4gcIUWQOCeBChlGczdZbHfqmNZQFLHB3yWxDFSMHFUdu2/OB9NUk7Awn5qRL+rws4HQNg==}
     peerDependencies:
       '@types/node': '*'
     peerDependenciesMeta:
@@ -849,16 +1008,27 @@ packages:
   '@rushstack/rig-package@0.5.3':
     resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==}
 
-  '@rushstack/terminal@0.13.3':
-    resolution: {integrity: sha512-fc3zjXOw8E0pXS5t9vTiIPx9gHA0fIdTXsu9mT4WbH+P3mYvnrX0iAQ5a6NvyK1+CqYWBTw/wVNx7SDJkI+WYQ==}
+  '@rushstack/terminal@0.14.2':
+    resolution: {integrity: sha512-2fC1wqu1VCExKC0/L+0noVcFQEXEnoBOtCIex1TOjBzEDWcw8KzJjjj7aTP6mLxepG0XIyn9OufeFb6SFsa+sg==}
     peerDependencies:
       '@types/node': '*'
     peerDependenciesMeta:
       '@types/node':
         optional: true
 
-  '@rushstack/ts-command-line@4.22.3':
-    resolution: {integrity: sha512-edMpWB3QhFFZ4KtSzS8WNjBgR4PXPPOVrOHMbb7kNpmQ1UFS9HdVtjCXg1H5fG+xYAbeE+TMPcVPUyX2p84STA==}
+  '@rushstack/ts-command-line@4.23.0':
+    resolution: {integrity: sha512-jYREBtsxduPV6ptNq8jOKp9+yx0ld1Tb/Tkdnlj8gTjazl1sF3DwX2VbluyYrNd0meWIL0bNeer7WDf5tKFjaQ==}
+
+  '@storyblok/eslint-config@0.3.0':
+    resolution: {integrity: sha512-7JJr3K+ibx4rGAgkQBrwncCpdJ+eaBM7PfCWE2s/gmCqyvQGuGu8IRRKv9/V2u9gyv1BLQBDWmEhz7J8mwQAlA==}
+    peerDependencies:
+      eslint: '>=8.40.0'
+
+  '@stylistic/eslint-plugin@2.10.1':
+    resolution: {integrity: sha512-U+4yzNXElTf9q0kEfnloI9XbOyD4cnEQCxjUI94q0+W++0GAEQvJ/slwEj9lwjDHfGADRSr+Tco/z0XJvmDfCQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: '>=8.40.0'
 
   '@sveltejs/vite-plugin-svelte-inspector@2.1.0':
     resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==}
@@ -878,8 +1048,8 @@ packages:
   '@swc/helpers@0.5.2':
     resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==}
 
-  '@tsconfig/recommended@1.0.7':
-    resolution: {integrity: sha512-xiNMgCuoy4mCL4JTywk9XFs5xpRUcKxtWEcMR6FNMtsgewYTIgIR+nvlP4A4iRCAzRsHMnPhvTRrzp4AGcRTEA==}
+  '@tsconfig/recommended@1.0.8':
+    resolution: {integrity: sha512-TotjFaaXveVUdsrXCdalyF6E5RyG6+7hHHQVZonQtdlk1rJZ1myDIvPUUKPhoYv+JAzThb2lQJh9+9ZfF46hsA==}
 
   '@tsconfig/svelte@5.0.4':
     resolution: {integrity: sha512-BV9NplVgLmSi4mwKzD8BD/NQ8erOY/nUE/GpgWe2ckx+wIQF5RyRirn/QsSSCPeulVpc3RA/iJt6DpfTIZps0Q==}
@@ -887,17 +1057,29 @@ packages:
   '@types/argparse@1.0.38':
     resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==}
 
+  '@types/conventional-commits-parser@5.0.0':
+    resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==}
+
+  '@types/debug@4.1.12':
+    resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+
   '@types/estree@1.0.5':
     resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
 
+  '@types/estree@1.0.6':
+    resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
+
   '@types/json-schema@7.0.15':
     resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
 
   '@types/json5@0.0.29':
     resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
 
-  '@types/minimist@1.2.5':
-    resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==}
+  '@types/mdast@4.0.4':
+    resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
+
+  '@types/ms@0.7.34':
+    resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
 
   '@types/node@22.4.2':
     resolution: {integrity: sha512-nAvM3Ey230/XzxtyDcJ+VjvlzpzoHwLsF7JaDRfoI0ytO0mVheerNmM45CtA0yOILXwXXxOrcUWH3wltX+7PSw==}
@@ -914,15 +1096,15 @@ packages:
   '@types/scheduler@0.23.0':
     resolution: {integrity: sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==}
 
-  '@types/semver@7.5.8':
-    resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
+  '@types/unist@3.0.3':
+    resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
 
-  '@typescript-eslint/eslint-plugin@6.21.0':
-    resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==}
-    engines: {node: ^16.0.0 || >=18.0.0}
+  '@typescript-eslint/eslint-plugin@8.14.0':
+    resolution: {integrity: sha512-tqp8H7UWFaZj0yNO6bycd5YjMwxa6wIHOLZvWPkidwbgLCsBMetQoGj7DPuAlWa2yGO3H48xmPwjhsSPPCGU5w==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
-      '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha
-      eslint: ^7.0.0 || ^8.0.0
+      '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
+      eslint: ^8.57.0 || ^9.0.0
       typescript: '*'
     peerDependenciesMeta:
       typescript:
@@ -938,15 +1120,28 @@ packages:
       typescript:
         optional: true
 
+  '@typescript-eslint/parser@8.14.0':
+    resolution: {integrity: sha512-2p82Yn9juUJq0XynBXtFCyrBDb6/dJombnz6vbo6mgQEtWHfvHbQuEa9kAOVIt1c9YFwi7H6WxtPj1kg+80+RA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
   '@typescript-eslint/scope-manager@6.21.0':
     resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==}
     engines: {node: ^16.0.0 || >=18.0.0}
 
-  '@typescript-eslint/type-utils@6.21.0':
-    resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==}
-    engines: {node: ^16.0.0 || >=18.0.0}
+  '@typescript-eslint/scope-manager@8.14.0':
+    resolution: {integrity: sha512-aBbBrnW9ARIDn92Zbo7rguLnqQ/pOrUguVpbUwzOhkFg2npFDwTgPGqFqE0H5feXcOoJOfX3SxlJaKEVtq54dw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@typescript-eslint/type-utils@8.14.0':
+    resolution: {integrity: sha512-Xcz9qOtZuGusVOH5Uk07NGs39wrKkf3AxlkK79RBK6aJC1l03CobXjJbwBPSidetAOV+5rEVuiT1VSBUOAsanQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
-      eslint: ^7.0.0 || ^8.0.0
       typescript: '*'
     peerDependenciesMeta:
       typescript:
@@ -956,6 +1151,10 @@ packages:
     resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==}
     engines: {node: ^16.0.0 || >=18.0.0}
 
+  '@typescript-eslint/types@8.14.0':
+    resolution: {integrity: sha512-yjeB9fnO/opvLJFAsPNYlKPnEM8+z4og09Pk504dkqonT02AyL5Z9SSqlE0XqezS93v6CXn49VHvB2G7XSsl0g==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   '@typescript-eslint/typescript-estree@6.21.0':
     resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==}
     engines: {node: ^16.0.0 || >=18.0.0}
@@ -965,67 +1164,120 @@ packages:
       typescript:
         optional: true
 
-  '@typescript-eslint/utils@6.21.0':
-    resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==}
-    engines: {node: ^16.0.0 || >=18.0.0}
+  '@typescript-eslint/typescript-estree@8.14.0':
+    resolution: {integrity: sha512-OPXPLYKGZi9XS/49rdaCbR5j/S14HazviBlUQFvSKz3npr3NikF+mrgK7CFVur6XEt95DZp/cmke9d5i3vtVnQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
-      eslint: ^7.0.0 || ^8.0.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@typescript-eslint/utils@8.14.0':
+    resolution: {integrity: sha512-OGqj6uB8THhrHj0Fk27DcHPojW7zKwKkPmHXHvQ58pLYp4hy8CSUdTKykKeh+5vFqTTVmjz0zCOOPKRovdsgHA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
 
   '@typescript-eslint/visitor-keys@6.21.0':
     resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==}
     engines: {node: ^16.0.0 || >=18.0.0}
 
+  '@typescript-eslint/visitor-keys@8.14.0':
+    resolution: {integrity: sha512-vG0XZo8AdTH9OE6VFRwAZldNc7qtJ/6NLGWak+BtENuEUXGZgFpihILPiBvKXvJ2nFu27XNGC6rKiwuaoMbYzQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   '@ungap/structured-clone@1.2.0':
     resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
 
-  '@vitest/coverage-v8@2.0.5':
-    resolution: {integrity: sha512-qeFcySCg5FLO2bHHSa0tAZAOnAUbp4L6/A5JDuj9+bt53JREl8hpLjLHEWF0e/gWc8INVpJaqA7+Ene2rclpZg==}
+  '@vitest/coverage-v8@2.1.4':
+    resolution: {integrity: sha512-FPKQuJfR6VTfcNMcGpqInmtJuVXFSCd9HQltYncfR01AzXhLucMEtQ5SinPdZxsT5x/5BK7I5qFJ5/ApGCmyTQ==}
+    peerDependencies:
+      '@vitest/browser': 2.1.4
+      vitest: 2.1.4
+    peerDependenciesMeta:
+      '@vitest/browser':
+        optional: true
+
+  '@vitest/eslint-plugin@1.1.8':
+    resolution: {integrity: sha512-Vej6LT38XxPayXi1RoiExxWgZWuNsx7kMudvRXHsuoYl0BykFB7vAR2OwFpuVFCkW35UW/DQ3EYB1Qj3IYHXvQ==}
     peerDependencies:
-      vitest: 2.0.5
+      '@typescript-eslint/utils': '>= 8.0'
+      eslint: '>= 8.57.0'
+      typescript: '>= 5.0.0'
+      vitest: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+      vitest:
+        optional: true
 
-  '@vitest/expect@2.0.5':
-    resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==}
+  '@vitest/expect@2.1.4':
+    resolution: {integrity: sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA==}
+
+  '@vitest/mocker@2.1.4':
+    resolution: {integrity: sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ==}
+    peerDependencies:
+      msw: ^2.4.9
+      vite: ^5.0.0
+    peerDependenciesMeta:
+      msw:
+        optional: true
+      vite:
+        optional: true
 
-  '@vitest/pretty-format@2.0.5':
-    resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==}
+  '@vitest/pretty-format@2.1.4':
+    resolution: {integrity: sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww==}
 
-  '@vitest/runner@2.0.5':
-    resolution: {integrity: sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==}
+  '@vitest/runner@2.1.4':
+    resolution: {integrity: sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA==}
 
-  '@vitest/snapshot@2.0.5':
-    resolution: {integrity: sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==}
+  '@vitest/snapshot@2.1.4':
+    resolution: {integrity: sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q==}
 
-  '@vitest/spy@2.0.5':
-    resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==}
+  '@vitest/spy@2.1.4':
+    resolution: {integrity: sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg==}
 
-  '@vitest/ui@2.0.5':
-    resolution: {integrity: sha512-m+ZpVt/PVi/nbeRKEjdiYeoh0aOfI9zr3Ria9LO7V2PlMETtAXJS3uETEZkc8Be2oOl8mhd7Ew+5SRBXRYncNw==}
+  '@vitest/ui@2.1.4':
+    resolution: {integrity: sha512-Zd9e5oU063c+j9N9XzGJagCLNvG71x/2tOme3Js4JEZKX55zsgxhJwUgLI8hkN6NjMLpdJO8d7nVUUuPGAA58Q==}
     peerDependencies:
-      vitest: 2.0.5
+      vitest: 2.1.4
 
-  '@vitest/utils@2.0.5':
-    resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==}
+  '@vitest/utils@2.1.4':
+    resolution: {integrity: sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==}
 
-  '@volar/language-core@2.4.0':
-    resolution: {integrity: sha512-FTla+khE+sYK0qJP+6hwPAAUwiNHVMph4RUXpxf/FIPKUP61NFrVZorml4mjFShnueR2y9/j8/vnh09YwVdH7A==}
+  '@volar/language-core@2.4.10':
+    resolution: {integrity: sha512-hG3Z13+nJmGaT+fnQzAkS0hjJRa2FCeqZt6Bd+oGNhUkQ+mTFsDETg5rqUTxyzIh5pSOGY7FHCWUS8G82AzLCA==}
 
-  '@volar/source-map@2.4.0':
-    resolution: {integrity: sha512-2ceY8/NEZvN6F44TXw2qRP6AQsvCYhV2bxaBPWxV9HqIfkbRydSksTFObCF1DBDNBfKiZTS8G/4vqV6cvjdOIQ==}
+  '@volar/source-map@2.4.10':
+    resolution: {integrity: sha512-OCV+b5ihV0RF3A7vEvNyHPi4G4kFa6ukPmyVocmqm5QzOd8r5yAtiNvaPEjl8dNvgC/lj4JPryeeHLdXd62rWA==}
 
-  '@volar/typescript@2.4.0':
-    resolution: {integrity: sha512-9zx3lQWgHmVd+JRRAHUSRiEhe4TlzL7U7e6ulWXOxHH/WNYxzKwCvZD7WYWEZFdw4dHfTD9vUR0yPQO6GilCaQ==}
+  '@volar/typescript@2.4.10':
+    resolution: {integrity: sha512-F8ZtBMhSXyYKuBfGpYwqA5rsONnOwAVvjyE7KPYJ7wgZqo2roASqNWUnianOomJX5u1cxeRooHV59N0PhvEOgw==}
 
   '@vue/compiler-core@3.4.38':
     resolution: {integrity: sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==}
 
+  '@vue/compiler-core@3.5.12':
+    resolution: {integrity: sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==}
+
   '@vue/compiler-dom@3.4.38':
     resolution: {integrity: sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ==}
 
+  '@vue/compiler-dom@3.5.12':
+    resolution: {integrity: sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==}
+
+  '@vue/compiler-sfc@3.5.12':
+    resolution: {integrity: sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==}
+
+  '@vue/compiler-ssr@3.5.12':
+    resolution: {integrity: sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==}
+
   '@vue/compiler-vue2@2.7.16':
     resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==}
 
-  '@vue/language-core@2.0.29':
-    resolution: {integrity: sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ==}
+  '@vue/language-core@2.1.6':
+    resolution: {integrity: sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==}
     peerDependencies:
       typescript: '*'
     peerDependenciesMeta:
@@ -1035,6 +1287,9 @@ packages:
   '@vue/shared@3.4.38':
     resolution: {integrity: sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==}
 
+  '@vue/shared@3.5.12':
+    resolution: {integrity: sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==}
+
   JSONStream@1.3.5:
     resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
     hasBin: true
@@ -1054,6 +1309,11 @@ packages:
     engines: {node: '>=0.4.0'}
     hasBin: true
 
+  acorn@8.14.0:
+    resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+
   ajv-draft-04@1.0.0:
     resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==}
     peerDependencies:
@@ -1079,9 +1339,6 @@ packages:
   ajv@8.13.0:
     resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==}
 
-  ajv@8.14.0:
-    resolution: {integrity: sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==}
-
   ansi-regex@5.0.1:
     resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
     engines: {node: '>=8'}
@@ -1102,6 +1359,10 @@ packages:
     resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
     engines: {node: '>=12'}
 
+  are-docs-informative@0.0.2:
+    resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==}
+    engines: {node: '>=14'}
+
   argparse@1.0.10:
     resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
 
@@ -1153,10 +1414,6 @@ packages:
     resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==}
     engines: {node: '>= 0.4'}
 
-  arrify@1.0.1:
-    resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==}
-    engines: {node: '>=0.10.0'}
-
   assertion-error@2.0.1:
     resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
     engines: {node: '>=12'}
@@ -1181,6 +1438,9 @@ packages:
   balanced-match@1.0.2:
     resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
 
+  boolbase@1.0.0:
+    resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
   brace-expansion@1.1.11:
     resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
 
@@ -1191,6 +1451,15 @@ packages:
     resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
     engines: {node: '>=8'}
 
+  browserslist@4.24.2:
+    resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==}
+    engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+    hasBin: true
+
+  builtin-modules@3.3.0:
+    resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
+    engines: {node: '>=6'}
+
   busboy@1.6.0:
     resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
     engines: {node: '>=10.16.0'}
@@ -1207,19 +1476,17 @@ packages:
     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'}
-
   caniuse-lite@1.0.30001632:
     resolution: {integrity: sha512-udx3o7yHJfUxMLkGohMlVHCvFvWmirKh9JAH/d7WOLPetlH+LTL5cocMZ0t7oZx/mdlOWXti97xLZWc8uURRHg==}
 
-  chai@5.1.1:
-    resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==}
+  caniuse-lite@1.0.30001680:
+    resolution: {integrity: sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==}
+
+  ccount@2.0.1:
+    resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+
+  chai@5.1.2:
+    resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==}
     engines: {node: '>=12'}
 
   chalk@2.4.2:
@@ -1230,10 +1497,25 @@ packages:
     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}
+
+  character-entities@2.0.2:
+    resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+
   check-error@2.1.1:
     resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
     engines: {node: '>= 16'}
 
+  ci-info@4.0.0:
+    resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==}
+    engines: {node: '>=8'}
+
+  clean-regexp@1.0.0:
+    resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==}
+    engines: {node: '>=4'}
+
   client-only@0.0.1:
     resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
 
@@ -1257,6 +1539,10 @@ packages:
   color-name@1.1.4:
     resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
 
+  comment-parser@1.4.1:
+    resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==}
+    engines: {node: '>= 12.0.0'}
+
   compare-func@2.0.0:
     resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==}
 
@@ -1285,16 +1571,19 @@ packages:
     engines: {node: '>=16'}
     hasBin: true
 
-  cosmiconfig-typescript-loader@5.0.0:
-    resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==}
+  core-js-compat@3.39.0:
+    resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==}
+
+  cosmiconfig-typescript-loader@5.1.0:
+    resolution: {integrity: sha512-7PtBB+6FdsOvZyJtlF3hEPpACq7RQX6BVGsgC7/lfVXnKMvNCu/XY3ykreqG5w/rBNdu2z8LCIKoF3kpHHdHlA==}
     engines: {node: '>=v16'}
     peerDependencies:
       '@types/node': '*'
       cosmiconfig: '>=8.2'
       typescript: '>=4'
 
-  cosmiconfig@8.3.6:
-    resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
+  cosmiconfig@9.0.0:
+    resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==}
     engines: {node: '>=14'}
     peerDependencies:
       typescript: '>=4.9.5'
@@ -1310,15 +1599,20 @@ packages:
     resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
     engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
 
+  cssesc@3.0.0:
+    resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+    engines: {node: '>=4'}
+    hasBin: true
+
   csstype@3.1.3:
     resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
 
   damerau-levenshtein@1.0.8:
     resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
 
-  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'}
 
   data-view-buffer@1.0.1:
     resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==}
@@ -1361,13 +1655,17 @@ packages:
       supports-color:
         optional: true
 
-  decamelize-keys@1.1.1:
-    resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==}
-    engines: {node: '>=0.10.0'}
+  debug@4.3.7:
+    resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
+    engines: {node: '>=6.0'}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
 
-  decamelize@1.2.0:
-    resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
-    engines: {node: '>=0.10.0'}
+  decode-named-character-reference@1.0.2:
+    resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
 
   deep-eql@5.0.2:
     resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
@@ -1392,6 +1690,9 @@ packages:
     resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
     engines: {node: '>=6'}
 
+  devlop@1.1.0:
+    resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
+
   dir-glob@3.0.1:
     resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
     engines: {node: '>=8'}
@@ -1411,6 +1712,9 @@ packages:
   eastasianwidth@0.2.0:
     resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
 
+  electron-to-chromium@1.5.56:
+    resolution: {integrity: sha512-7lXb9dAvimCFdvUMTyucD4mnIndt/xhRKFAlky0CyFogdnNmdPQNoHI23msF/2V4mpTxMzgMdjK4+YRlFlRQZw==}
+
   emoji-regex@8.0.0:
     resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
 
@@ -1421,10 +1725,18 @@ packages:
     resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==}
     engines: {node: '>=10.13.0'}
 
+  enhanced-resolve@5.17.1:
+    resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==}
+    engines: {node: '>=10.13.0'}
+
   entities@4.5.0:
     resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
     engines: {node: '>=0.12'}
 
+  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==}
 
@@ -1444,6 +1756,9 @@ packages:
     resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==}
     engines: {node: '>= 0.4'}
 
+  es-module-lexer@1.5.4:
+    resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==}
+
   es-object-atoms@1.0.0:
     resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
     engines: {node: '>= 0.4'}
@@ -1473,6 +1788,10 @@ packages:
     resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
     engines: {node: '>=6'}
 
+  escalade@3.2.0:
+    resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+    engines: {node: '>=6'}
+
   escape-string-regexp@1.0.5:
     resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
     engines: {node: '>=0.8.0'}
@@ -1481,6 +1800,27 @@ packages:
     resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
     engines: {node: '>=10'}
 
+  escape-string-regexp@5.0.0:
+    resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+    engines: {node: '>=12'}
+
+  eslint-compat-utils@0.5.1:
+    resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==}
+    engines: {node: '>=12'}
+    peerDependencies:
+      eslint: '>=6.0.0'
+
+  eslint-compat-utils@0.6.0:
+    resolution: {integrity: sha512-1vVBdI/HLS6HTHVQCJGlN+LOF0w1Rs/WB9se23mQr84cRM0iMM8PulMFFhQdQ1BvS0cGwjpis4xziI91Rk0l6g==}
+    engines: {node: '>=12'}
+    peerDependencies:
+      eslint: '>=6.0.0'
+
+  eslint-config-flat-gitignore@0.3.0:
+    resolution: {integrity: sha512-0Ndxo4qGhcewjTzw52TK06Mc00aDtHNTdeeW2JfONgDcLkRO/n/BteMRzNVpLQYxdCC/dFEilfM9fjjpGIJ9Og==}
+    peerDependencies:
+      eslint: ^9.5.0
+
   eslint-config-next@14.0.4:
     resolution: {integrity: sha512-9/xbOHEQOmQtqvQ1UsTQZpnA7SlDMBtuKJ//S4JnoyK3oGLhILKXdBgu/UO7lQo/2xOykQULS1qQ6p2+EpHgAQ==}
     peerDependencies:
@@ -1496,6 +1836,14 @@ packages:
     peerDependencies:
       eslint: '>=7.0.0'
 
+  eslint-flat-config-utils@0.4.0:
+    resolution: {integrity: sha512-kfd5kQZC+BMO0YwTol6zxjKX1zAsk8JfSAopbKjKqmENTJcew+yBejuvccAg37cvOrN0Mh+DVbeyznuNWEjt4A==}
+
+  eslint-formatting-reporter@0.0.0:
+    resolution: {integrity: sha512-k9RdyTqxqN/wNYVaTk/ds5B5rA8lgoAmvceYN7bcZMBwU7TuXx5ntewJv81eF3pIL/CiJE+pJZm36llG8yhyyw==}
+    peerDependencies:
+      eslint: '>=8.40.0'
+
   eslint-import-resolver-node@0.3.9:
     resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
 
@@ -1506,6 +1854,22 @@ packages:
       eslint: '*'
       eslint-plugin-import: '*'
 
+  eslint-json-compat-utils@0.2.1:
+    resolution: {integrity: sha512-YzEodbDyW8DX8bImKhAcCeu/L31Dd/70Bidx2Qex9OFUtgzXLqtfWL4Hr5fM/aCCB8QUZLuJur0S9k6UfgFkfg==}
+    engines: {node: '>=12'}
+    peerDependencies:
+      '@eslint/json': '*'
+      eslint: '*'
+      jsonc-eslint-parser: ^2.4.0
+    peerDependenciesMeta:
+      '@eslint/json':
+        optional: true
+
+  eslint-merge-processors@0.1.0:
+    resolution: {integrity: sha512-IvRXXtEajLeyssvW4wJcZ2etxkR9mUf4zpNwgI+m/Uac9RfXHskuJefkHUcawVzePnd6xp24enp5jfgdHzjRdQ==}
+    peerDependencies:
+      eslint: '*'
+
   eslint-module-utils@2.8.1:
     resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==}
     engines: {node: '>=4'}
@@ -1527,6 +1891,36 @@ packages:
       eslint-import-resolver-webpack:
         optional: true
 
+  eslint-parser-plain@0.1.0:
+    resolution: {integrity: sha512-oOeA6FWU0UJT/Rxc3XF5Cq0nbIZbylm7j8+plqq0CZoE6m4u32OXJrR+9iy4srGMmF6v6pmgvP1zPxSRIGh3sg==}
+
+  eslint-plugin-antfu@2.7.0:
+    resolution: {integrity: sha512-gZM3jq3ouqaoHmUNszb1Zo2Ux7RckSvkGksjLWz9ipBYGSv1EwwBETN6AdiUXn+RpVHXTbEMPAPlXJazcA6+iA==}
+    peerDependencies:
+      eslint: '*'
+
+  eslint-plugin-command@0.2.6:
+    resolution: {integrity: sha512-T0bHZ1oblW1xUHUVoBKZJR2osSNNGkfZuK4iqboNwuNS/M7tdp3pmURaJtTi/XDzitxaQ02lvOdFH0mUd5QLvQ==}
+    peerDependencies:
+      eslint: '*'
+
+  eslint-plugin-es-x@7.8.0:
+    resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    peerDependencies:
+      eslint: '>=8'
+
+  eslint-plugin-format@0.1.2:
+    resolution: {integrity: sha512-ZrcO3aiumgJ6ENAv65IWkPjtW77ML/5mp0YrRK0jdvvaZJb+4kKWbaQTMr/XbJo6CtELRmCApAziEKh7L2NbdQ==}
+    peerDependencies:
+      eslint: ^8.40.0 || ^9.0.0
+
+  eslint-plugin-import-x@4.4.2:
+    resolution: {integrity: sha512-mDRXPSLQ0UQZQw91QdG4/qZT6hgeW2MJTczAbgPseUZuPEtIjjdPOolXroRkulnOn3fzj6gNgvk+wchMJiHElg==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+
   eslint-plugin-import@2.29.1:
     resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==}
     engines: {node: '>=4'}
@@ -1537,12 +1931,53 @@ packages:
       '@typescript-eslint/parser':
         optional: true
 
+  eslint-plugin-jsdoc@50.4.3:
+    resolution: {integrity: sha512-uWtwFxGRv6B8sU63HZM5dAGDhgsatb+LONwmILZJhdRALLOkCX2HFZhdL/Kw2ls8SQMAVEfK+LmnEfxInRN8HA==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
+
+  eslint-plugin-jsonc@2.18.1:
+    resolution: {integrity: sha512-6qY8zDpxOwPQNcr8eZ+RxwGX6IPHws5/Qef7aBEjER8rB9+UMB6zQWVIVcbP7xzFmEMHAesNFPe/sIlU4c78dg==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: '>=6.0.0'
+
   eslint-plugin-jsx-a11y@6.8.0:
     resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==}
     engines: {node: '>=4.0'}
     peerDependencies:
       eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
 
+  eslint-plugin-n@17.13.1:
+    resolution: {integrity: sha512-97qzhk1z3DdSJNCqT45EslwCu5+LB9GDadSyBItgKUfGsXAmN/aa7LRQ0ZxHffUxUzvgbTPJL27/pE9ZQWHy7A==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: '>=8.23.0'
+
+  eslint-plugin-no-only-tests@3.3.0:
+    resolution: {integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==}
+    engines: {node: '>=5.0.0'}
+
+  eslint-plugin-perfectionist@3.9.1:
+    resolution: {integrity: sha512-9WRzf6XaAxF4Oi5t/3TqKP5zUjERhasHmLFHin2Yw6ZAp/EP/EVA2dr3BhQrrHWCm5SzTMZf0FcjDnBkO2xFkA==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    peerDependencies:
+      astro-eslint-parser: ^1.0.2
+      eslint: '>=8.0.0'
+      svelte: '>=3.0.0'
+      svelte-eslint-parser: ^0.41.1
+      vue-eslint-parser: '>=9.0.0'
+    peerDependenciesMeta:
+      astro-eslint-parser:
+        optional: true
+      svelte:
+        optional: true
+      svelte-eslint-parser:
+        optional: true
+      vue-eslint-parser:
+        optional: true
+
   eslint-plugin-react-hooks@4.6.2:
     resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==}
     engines: {node: '>=10'}
@@ -1555,23 +1990,85 @@ packages:
     peerDependencies:
       eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
 
+  eslint-plugin-regexp@2.6.0:
+    resolution: {integrity: sha512-FCL851+kislsTEQEMioAlpDuK5+E5vs0hi1bF8cFlPlHcEjeRhuAzEsGikXRreE+0j4WhW2uO54MqTjXtYOi3A==}
+    engines: {node: ^18 || >=20}
+    peerDependencies:
+      eslint: '>=8.44.0'
+
+  eslint-plugin-toml@0.11.1:
+    resolution: {integrity: sha512-Y1WuMSzfZpeMIrmlP1nUh3kT8p96mThIq4NnHrYUhg10IKQgGfBZjAWnrg9fBqguiX4iFps/x/3Hb5TxBisfdw==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: '>=6.0.0'
+
+  eslint-plugin-unicorn@55.0.0:
+    resolution: {integrity: sha512-n3AKiVpY2/uDcGrS3+QsYDkjPfaOrNrsfQxU9nt5nitd9KuvVXrfAvgCO9DYPSfap+Gqjw9EOrXIsBp5tlHZjA==}
+    engines: {node: '>=18.18'}
+    peerDependencies:
+      eslint: '>=8.56.0'
+
+  eslint-plugin-unused-imports@4.1.4:
+    resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==}
+    peerDependencies:
+      '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0
+      eslint: ^9.0.0 || ^8.0.0
+    peerDependenciesMeta:
+      '@typescript-eslint/eslint-plugin':
+        optional: true
+
+  eslint-plugin-vue@9.31.0:
+    resolution: {integrity: sha512-aYMUCgivhz1o4tLkRHj5oq9YgYPM4/EJc0M7TAKRLCUA5OYxRLAhYEVD2nLtTwLyixEFI+/QXSvKU9ESZFgqjQ==}
+    engines: {node: ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0
+
+  eslint-plugin-yml@1.15.0:
+    resolution: {integrity: sha512-leC8APYVOsKyWUlvRwVhewytK5wS70BfMqIaUplFstRfzCoVp0YoEroV4cUEvQrBj93tQ3M9LcjO/ewr6D4kjA==}
+    engines: {node: ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: '>=6.0.0'
+
+  eslint-processor-vue-blocks@0.1.2:
+    resolution: {integrity: sha512-PfpJ4uKHnqeL/fXUnzYkOax3aIenlwewXRX8jFinA1a2yCFnLgMuiH3xvCgvHHUlV2xJWQHbCTdiJWGwb3NqpQ==}
+    peerDependencies:
+      '@vue/compiler-sfc': ^3.3.0
+      eslint: ^8.50.0 || ^9.0.0
+
   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-scope@8.2.0:
+    resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.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-visitor-keys@4.2.0:
+    resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   eslint@8.55.0:
     resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     hasBin: true
 
-  eslint@8.57.0:
-    resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+  eslint@9.14.0:
+    resolution: {integrity: sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     hasBin: true
+    peerDependencies:
+      jiti: '*'
+    peerDependenciesMeta:
+      jiti:
+        optional: true
+
+  espree@10.3.0:
+    resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
   espree@9.6.1:
     resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
@@ -1581,6 +2078,10 @@ packages:
     resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
     engines: {node: '>=0.10'}
 
+  esquery@1.6.0:
+    resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
+    engines: {node: '>=0.10'}
+
   esrecurse@4.3.0:
     resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
     engines: {node: '>=4.0'}
@@ -1599,17 +2100,16 @@ packages:
     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@8.0.1:
-    resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
-    engines: {node: '>=16.17'}
+  expect-type@1.1.0:
+    resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==}
+    engines: {node: '>=12.0.0'}
 
   fast-deep-equal@3.1.3:
     resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
 
+  fast-diff@1.3.0:
+    resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
+
   fast-glob@3.3.2:
     resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
     engines: {node: '>=8.6.0'}
@@ -1623,6 +2123,14 @@ packages:
   fastq@1.17.1:
     resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
 
+  fdir@6.4.2:
+    resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==}
+    peerDependencies:
+      picomatch: ^3 || ^4
+    peerDependenciesMeta:
+      picomatch:
+        optional: true
+
   fflate@0.8.2:
     resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==}
 
@@ -1630,10 +2138,18 @@ packages:
     resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
     engines: {node: ^10.12.0 || >=12.0.0}
 
+  file-entry-cache@8.0.0:
+    resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+    engines: {node: '>=16.0.0'}
+
   fill-range@7.1.1:
     resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
     engines: {node: '>=8'}
 
+  find-up-simple@1.0.0:
+    resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==}
+    engines: {node: '>=18'}
+
   find-up@4.1.0:
     resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
     engines: {node: '>=8'}
@@ -1642,10 +2158,18 @@ packages:
     resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
     engines: {node: '>=10'}
 
-  flat-cache@3.2.0:
+  find-up@7.0.0:
+    resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==}
+    engines: {node: '>=18'}
+
+  flat-cache@3.2.0:
     resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
     engines: {node: ^10.12.0 || >=12.0.0}
 
+  flat-cache@4.0.1:
+    resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+    engines: {node: '>=16'}
+
   flatted@3.3.1:
     resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
 
@@ -1689,14 +2213,6 @@ packages:
     resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
     engines: {node: '>= 0.4'}
 
-  get-stream@6.0.1:
-    resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
-    engines: {node: '>=10'}
-
-  get-stream@8.0.1:
-    resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
-    engines: {node: '>=16'}
-
   get-symbol-description@1.0.2:
     resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==}
     engines: {node: '>= 0.4'}
@@ -1704,9 +2220,12 @@ packages:
   get-tsconfig@4.7.5:
     resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==}
 
-  git-raw-commits@2.0.11:
-    resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==}
-    engines: {node: '>=10'}
+  get-tsconfig@4.8.1:
+    resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==}
+
+  git-raw-commits@4.0.0:
+    resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==}
+    engines: {node: '>=16'}
     hasBin: true
 
   glob-parent@5.1.2:
@@ -1732,14 +2251,22 @@ packages:
     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'}
+  global-directory@4.0.1:
+    resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==}
+    engines: {node: '>=18'}
 
   globals@13.24.0:
     resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
     engines: {node: '>=8'}
 
+  globals@14.0.0:
+    resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+    engines: {node: '>=18'}
+
+  globals@15.12.0:
+    resolution: {integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==}
+    engines: {node: '>=18'}
+
   globalthis@1.0.4:
     resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
     engines: {node: '>= 0.4'}
@@ -1757,10 +2284,6 @@ packages:
   graphemer@1.4.0:
     resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
 
-  hard-rejection@2.1.0:
-    resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==}
-    engines: {node: '>=6'}
-
   has-bigints@1.0.2:
     resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
 
@@ -1798,30 +2321,17 @@ packages:
   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@5.0.0:
-    resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
-    engines: {node: '>=16.17.0'}
-
-  husky@9.1.5:
-    resolution: {integrity: sha512-rowAVRUBfI0b4+niA4SJMhfQwc107VLkBUgEYYAOQAbqDCnra1nYh83hF/MDmhYs9t9n1E3DuKOrs2LYNC+0Ag==}
-    engines: {node: '>=18'}
-    hasBin: true
-
   ignore@5.3.1:
     resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
     engines: {node: '>= 4'}
 
+  ignore@5.3.2:
+    resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+    engines: {node: '>= 4'}
+
   import-fresh@3.3.0:
     resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
     engines: {node: '>=6'}
@@ -1830,6 +2340,9 @@ packages:
     resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==}
     engines: {node: '>=8'}
 
+  import-meta-resolve@4.1.0:
+    resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==}
+
   imurmurhash@0.1.4:
     resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
     engines: {node: '>=0.8.19'}
@@ -1845,8 +2358,9 @@ packages:
   inherits@2.0.4:
     resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
 
-  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}
 
   internal-slot@1.0.7:
     resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
@@ -1870,6 +2384,10 @@ packages:
     resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
     engines: {node: '>= 0.4'}
 
+  is-builtin-module@3.2.1:
+    resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==}
+    engines: {node: '>=6'}
+
   is-callable@1.2.7:
     resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
     engines: {node: '>= 0.4'}
@@ -1928,10 +2446,6 @@ packages:
     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-reference@3.0.2:
     resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==}
 
@@ -1947,14 +2461,6 @@ packages:
     resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==}
     engines: {node: '>= 0.4'}
 
-  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-string@1.0.7:
     resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
     engines: {node: '>= 0.4'}
@@ -2013,8 +2519,8 @@ packages:
   jackspeak@3.4.3:
     resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
 
-  jiti@1.21.0:
-    resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==}
+  jiti@1.21.6:
+    resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==}
     hasBin: true
 
   jju@1.4.0:
@@ -2027,6 +2533,19 @@ packages:
     resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
     hasBin: true
 
+  jsdoc-type-pratt-parser@4.1.0:
+    resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==}
+    engines: {node: '>=12.0.0'}
+
+  jsesc@0.5.0:
+    resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==}
+    hasBin: true
+
+  jsesc@3.0.2:
+    resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
+    engines: {node: '>=6'}
+    hasBin: true
+
   json-buffer@3.0.1:
     resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
 
@@ -2046,6 +2565,10 @@ packages:
     resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
     hasBin: true
 
+  jsonc-eslint-parser@2.4.0:
+    resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
   jsonfile@4.0.0:
     resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
 
@@ -2060,10 +2583,6 @@ packages:
   keyv@4.5.4:
     resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
 
-  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'}
@@ -2100,12 +2619,13 @@ packages:
     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==}
 
@@ -2133,6 +2653,9 @@ packages:
   lodash@4.17.21:
     resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
 
+  longest-streak@3.1.0:
+    resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
+
   loose-envify@1.4.0:
     resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
     hasBin: true
@@ -2140,6 +2663,9 @@ packages:
   loupe@3.1.1:
     resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==}
 
+  loupe@3.1.2:
+    resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==}
+
   lru-cache@10.4.3:
     resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
 
@@ -2153,20 +2679,51 @@ packages:
   magic-string@0.30.11:
     resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==}
 
-  magicast@0.3.4:
-    resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==}
+  magic-string@0.30.12:
+    resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==}
+
+  magicast@0.3.5:
+    resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==}
 
   make-dir@4.0.0:
     resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
     engines: {node: '>=10'}
 
-  map-obj@1.0.1:
-    resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==}
-    engines: {node: '>=0.10.0'}
+  markdown-table@3.0.4:
+    resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
 
-  map-obj@4.3.0:
-    resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==}
-    engines: {node: '>=8'}
+  mdast-util-find-and-replace@3.0.1:
+    resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==}
+
+  mdast-util-from-markdown@2.0.2:
+    resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==}
+
+  mdast-util-gfm-autolink-literal@2.0.1:
+    resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==}
+
+  mdast-util-gfm-footnote@2.0.0:
+    resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==}
+
+  mdast-util-gfm-strikethrough@2.0.0:
+    resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==}
+
+  mdast-util-gfm-table@2.0.0:
+    resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==}
+
+  mdast-util-gfm-task-list-item@2.0.0:
+    resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==}
+
+  mdast-util-gfm@3.0.0:
+    resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==}
+
+  mdast-util-phrasing@4.1.0:
+    resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
+
+  mdast-util-to-markdown@2.1.2:
+    resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==}
+
+  mdast-util-to-string@4.0.0:
+    resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
 
   mdn-data@2.0.30:
     resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
@@ -2175,29 +2732,98 @@ packages:
     resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==}
     engines: {node: '>=16.10'}
 
-  meow@8.1.2:
-    resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==}
-    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'}
 
+  micromark-core-commonmark@2.0.1:
+    resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==}
+
+  micromark-extension-gfm-autolink-literal@2.1.0:
+    resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==}
+
+  micromark-extension-gfm-footnote@2.1.0:
+    resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==}
+
+  micromark-extension-gfm-strikethrough@2.1.0:
+    resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==}
+
+  micromark-extension-gfm-table@2.1.0:
+    resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==}
+
+  micromark-extension-gfm-tagfilter@2.0.0:
+    resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==}
+
+  micromark-extension-gfm-task-list-item@2.1.0:
+    resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==}
+
+  micromark-extension-gfm@3.0.0:
+    resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
+
+  micromark-factory-destination@2.0.0:
+    resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==}
+
+  micromark-factory-label@2.0.0:
+    resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==}
+
+  micromark-factory-space@2.0.0:
+    resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==}
+
+  micromark-factory-title@2.0.0:
+    resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==}
+
+  micromark-factory-whitespace@2.0.0:
+    resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==}
+
+  micromark-util-character@2.1.0:
+    resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==}
+
+  micromark-util-chunked@2.0.0:
+    resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==}
+
+  micromark-util-classify-character@2.0.0:
+    resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==}
+
+  micromark-util-combine-extensions@2.0.0:
+    resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==}
+
+  micromark-util-decode-numeric-character-reference@2.0.1:
+    resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==}
+
+  micromark-util-decode-string@2.0.0:
+    resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==}
+
+  micromark-util-encode@2.0.0:
+    resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==}
+
+  micromark-util-html-tag-name@2.0.0:
+    resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==}
+
+  micromark-util-normalize-identifier@2.0.0:
+    resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==}
+
+  micromark-util-resolve-all@2.0.0:
+    resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==}
+
+  micromark-util-sanitize-uri@2.0.0:
+    resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==}
+
+  micromark-util-subtokenize@2.0.1:
+    resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==}
+
+  micromark-util-symbol@2.0.0:
+    resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==}
+
+  micromark-util-types@2.0.0:
+    resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==}
+
+  micromark@4.0.0:
+    resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==}
+
   micromatch@4.0.7:
     resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==}
     engines: {node: '>=8.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'}
-
   min-indent@1.0.1:
     resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
     engines: {node: '>=4'}
@@ -2216,10 +2842,6 @@ packages:
     resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
     engines: {node: '>=16 || 14 >=14.17'}
 
-  minimist-options@4.1.0:
-    resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==}
-    engines: {node: '>= 6'}
-
   minimist@1.2.8:
     resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
 
@@ -2237,6 +2859,9 @@ packages:
   ms@2.1.2:
     resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
 
+  ms@2.1.3:
+    resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
   muggle-string@0.4.1:
     resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
 
@@ -2245,6 +2870,9 @@ packages:
     engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
     hasBin: true
 
+  natural-compare-lite@1.4.0:
+    resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==}
+
   natural-compare@1.4.0:
     resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
 
@@ -2272,20 +2900,14 @@ packages:
       encoding:
         optional: true
 
+  node-releases@2.0.18:
+    resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
+
   normalize-package-data@2.5.0:
     resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
 
-  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.3.0:
-    resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
-    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+  nth-check@2.1.1:
+    resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
 
   object-assign@4.1.1:
     resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
@@ -2325,14 +2947,6 @@ packages:
   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'}
-
   optionator@0.9.4:
     resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
     engines: {node: '>= 0.8.0'}
@@ -2345,6 +2959,10 @@ packages:
     resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
     engines: {node: '>=10'}
 
+  p-limit@4.0.0:
+    resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
   p-locate@4.1.0:
     resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
     engines: {node: '>=8'}
@@ -2353,6 +2971,10 @@ packages:
     resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
     engines: {node: '>=10'}
 
+  p-locate@6.0.0:
+    resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
   p-try@2.2.0:
     resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
     engines: {node: '>=6'}
@@ -2360,10 +2982,21 @@ packages:
   package-json-from-dist@1.0.0:
     resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==}
 
+  package-manager-detector@0.2.2:
+    resolution: {integrity: sha512-VgXbyrSNsml4eHWIvxxG/nTL4wgybMTXCV2Un/+yEc3aDKKU6nQBZjbeP3Pl3qm9Qg92X/1ng4ffvCeD/zwHgg==}
+
   parent-module@1.0.1:
     resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
     engines: {node: '>=6'}
 
+  parse-gitignore@2.0.0:
+    resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==}
+    engines: {node: '>=14'}
+
+  parse-imports@2.2.1:
+    resolution: {integrity: sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==}
+    engines: {node: '>= 18'}
+
   parse-json@5.2.0:
     resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
     engines: {node: '>=8'}
@@ -2375,6 +3008,10 @@ packages:
     resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
     engines: {node: '>=8'}
 
+  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-is-absolute@1.0.1:
     resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
     engines: {node: '>=0.10.0'}
@@ -2383,10 +3020,6 @@ packages:
     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==}
 
@@ -2411,20 +3044,35 @@ packages:
   picocolors@1.0.1:
     resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
 
+  picocolors@1.1.1:
+    resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
   picomatch@2.3.1:
     resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
     engines: {node: '>=8.6'}
 
+  picomatch@4.0.2:
+    resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
+    engines: {node: '>=12'}
+
   pkg-types@1.1.3:
     resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==}
 
   playground@file:playground:
     resolution: {directory: playground, type: directory}
 
+  pluralize@8.0.0:
+    resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
+    engines: {node: '>=4'}
+
   possible-typed-array-names@1.0.0:
     resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
     engines: {node: '>= 0.4'}
 
+  postcss-selector-parser@6.1.2:
+    resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
+    engines: {node: '>=4'}
+
   postcss@8.4.31:
     resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
     engines: {node: ^10 || ^12 || >=14}
@@ -2437,10 +3085,18 @@ packages:
     resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==}
     engines: {node: ^10 || ^12 || >=14}
 
+  postcss@8.4.49:
+    resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
+    engines: {node: ^10 || ^12 || >=14}
+
   prelude-ls@1.2.1:
     resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
     engines: {node: '>= 0.8.0'}
 
+  prettier-linter-helpers@1.0.0:
+    resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
+    engines: {node: '>=6.0.0'}
+
   prettier@3.3.3:
     resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==}
     engines: {node: '>=14'}
@@ -2460,10 +3116,6 @@ packages:
   queue-microtask@1.2.3:
     resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
 
-  quick-lru@4.0.1:
-    resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==}
-    engines: {node: '>=8'}
-
   react-dom@18.3.1:
     resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
     peerDependencies:
@@ -2484,13 +3136,9 @@ packages:
     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'}
+  refa@0.12.1:
+    resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==}
+    engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
 
   reflect.getprototypeof@1.0.6:
     resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==}
@@ -2499,10 +3147,22 @@ packages:
   regenerator-runtime@0.14.1:
     resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
 
+  regexp-ast-analysis@0.7.1:
+    resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==}
+    engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+  regexp-tree@0.1.27:
+    resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==}
+    hasBin: true
+
   regexp.prototype.flags@1.5.2:
     resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==}
     engines: {node: '>= 0.4'}
 
+  regjsparser@0.10.0:
+    resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==}
+    hasBin: true
+
   require-directory@2.1.1:
     resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
     engines: {node: '>=0.10.0'}
@@ -2519,10 +3179,6 @@ 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-pkg-maps@1.0.0:
     resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
 
@@ -2560,9 +3216,6 @@ packages:
     resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==}
     engines: {node: '>=0.4'}
 
-  safe-buffer@5.2.1:
-    resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
-
   safe-regex-test@1.0.3:
     resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==}
     engines: {node: '>= 0.4'}
@@ -2570,6 +3223,10 @@ packages:
   scheduler@0.23.2:
     resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
 
+  scslre@0.3.0:
+    resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==}
+    engines: {node: ^14.0.0 || >=16.0.0}
+
   semver@5.7.2:
     resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
     hasBin: true
@@ -2583,11 +3240,6 @@ packages:
     engines: {node: '>=10'}
     hasBin: true
 
-  semver@7.6.0:
-    resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==}
-    engines: {node: '>=10'}
-    hasBin: true
-
   semver@7.6.2:
     resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==}
     engines: {node: '>=10'}
@@ -2621,25 +3273,32 @@ packages:
   siginfo@2.0.0:
     resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
 
-  signal-exit@3.0.7:
-    resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
-
   signal-exit@4.1.0:
     resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
     engines: {node: '>=14'}
 
-  sirv@2.0.4:
-    resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==}
-    engines: {node: '>= 10'}
+  sirv@3.0.0:
+    resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==}
+    engines: {node: '>=18'}
+
+  sisteransi@1.0.5:
+    resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
 
   slash@3.0.0:
     resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
     engines: {node: '>=8'}
 
+  slashes@3.0.12:
+    resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==}
+
   source-map-js@1.2.0:
     resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
     engines: {node: '>=0.10.0'}
 
+  source-map-js@1.2.1:
+    resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+    engines: {node: '>=0.10.0'}
+
   source-map@0.6.1:
     resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
     engines: {node: '>=0.10.0'}
@@ -2653,11 +3312,11 @@ packages:
   spdx-expression-parse@3.0.1:
     resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
 
-  spdx-license-ids@3.0.18:
-    resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==}
+  spdx-expression-parse@4.0.0:
+    resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==}
 
-  split2@3.2.2:
-    resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==}
+  spdx-license-ids@3.0.20:
+    resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==}
 
   split2@4.2.0:
     resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
@@ -2666,6 +3325,9 @@ packages:
   sprintf-js@1.0.3:
     resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
 
+  stable-hash@0.0.4:
+    resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==}
+
   stackback@0.0.2:
     resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
 
@@ -2703,9 +3365,6 @@ packages:
     resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
     engines: {node: '>= 0.4'}
 
-  string_decoder@1.3.0:
-    resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
-
   strip-ansi@6.0.1:
     resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
     engines: {node: '>=8'}
@@ -2718,14 +3377,6 @@ packages:
     resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
     engines: {node: '>=4'}
 
-  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==}
-    engines: {node: '>=12'}
-
   strip-indent@3.0.0:
     resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
     engines: {node: '>=8'}
@@ -2778,6 +3429,14 @@ packages:
     peerDependencies:
       react: ^16.11.0 || ^17.0.0 || ^18.0.0
 
+  synckit@0.6.2:
+    resolution: {integrity: sha512-Vhf+bUa//YSTYKseDiiEuQmhGCoIF3CVBhunm3r/DQnYiGT4JssmnKQc44BIyOZRK2pKjXXAgbhfmbeoC9CJpA==}
+    engines: {node: '>=12.20'}
+
+  synckit@0.9.2:
+    resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+
   tapable@2.2.1:
     resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
     engines: {node: '>=6'}
@@ -2793,15 +3452,19 @@ packages:
   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==}
 
   tinybench@2.9.0:
     resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
 
+  tinyexec@0.3.1:
+    resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==}
+
+  tinyglobby@0.2.10:
+    resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==}
+    engines: {node: '>=12.0.0'}
+
   tinypool@1.0.1:
     resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==}
     engines: {node: ^18.0.0 || >=20.0.0}
@@ -2810,8 +3473,8 @@ packages:
     resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==}
     engines: {node: '>=14.0.0'}
 
-  tinyspy@3.0.0:
-    resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==}
+  tinyspy@3.0.2:
+    resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
     engines: {node: '>=14.0.0'}
 
   to-fast-properties@2.0.0:
@@ -2822,6 +3485,10 @@ packages:
     resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
     engines: {node: '>=8.0'}
 
+  toml-eslint-parser@0.10.0:
+    resolution: {integrity: sha512-khrZo4buq4qVmsGzS5yQjKe/WsFvV8fGfOjDQN0q4iy9FjRfPWRgTFrU8u1R2iu/SfWLhY9WnCi4Jhdrcbtg+g==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
   totalist@3.0.1:
     resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
     engines: {node: '>=6'}
@@ -2829,10 +3496,6 @@ packages:
   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.3.0:
     resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==}
     engines: {node: '>=16'}
@@ -2849,10 +3512,6 @@ packages:
     resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
     engines: {node: '>= 0.8.0'}
 
-  type-fest@0.18.1:
-    resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==}
-    engines: {node: '>=10'}
-
   type-fest@0.20.2:
     resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
     engines: {node: '>=10'}
@@ -2891,8 +3550,8 @@ packages:
     engines: {node: '>=14.17'}
     hasBin: true
 
-  typescript@5.5.4:
-    resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==}
+  typescript@5.6.3:
+    resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
     engines: {node: '>=14.17'}
     hasBin: true
 
@@ -2905,10 +3564,32 @@ packages:
   undici-types@6.19.8:
     resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
 
+  unicorn-magic@0.1.0:
+    resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==}
+    engines: {node: '>=18'}
+
+  unist-util-is@6.0.0:
+    resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==}
+
+  unist-util-stringify-position@4.0.0:
+    resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
+
+  unist-util-visit-parents@6.0.1:
+    resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==}
+
+  unist-util-visit@5.0.0:
+    resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
+
   universalify@0.1.2:
     resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
     engines: {node: '>= 4.0.0'}
 
+  update-browserslist-db@1.1.1:
+    resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==}
+    hasBin: true
+    peerDependencies:
+      browserslist: '>= 4.21.0'
+
   uri-js@4.4.1:
     resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
 
@@ -2923,16 +3604,16 @@ packages:
   validate-npm-package-license@3.0.4:
     resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
 
-  vite-node@2.0.5:
-    resolution: {integrity: sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==}
+  vite-node@2.1.4:
+    resolution: {integrity: sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg==}
     engines: {node: ^18.0.0 || >=20.0.0}
     hasBin: true
 
-  vite-plugin-banner@0.7.1:
-    resolution: {integrity: sha512-Bww2Xd5tOGsZ1yZ9rQiGneryvsL1u86znPrqeQjCsXPsG72pnSdV5lcQA+cy8UNDguMqyTJiCevlNUbLnT85UA==}
+  vite-plugin-banner@0.8.0:
+    resolution: {integrity: sha512-JpDWDYxtrsytuvUOJCgJcTkBb6XM8yPOidjRtB6F5SW1JSzDd/Y+PD/44wR6ovWKXhSUiyDRqPvx7mMf8+8ELg==}
 
-  vite-plugin-dts@4.0.3:
-    resolution: {integrity: sha512-+xnTsaONwU2kV6zhRjtbRJSGN41uFR/whqmcb4k4fftLFDJElxthp0PP5Fq8gMeM9ytWMt1yk5gGgekLREWYQQ==}
+  vite-plugin-dts@4.3.0:
+    resolution: {integrity: sha512-LkBJh9IbLwL6/rxh0C1/bOurDrIEmRE7joC+jFdOEEciAFPbpEKOLSAr5nNh5R7CJ45cMbksTrFfy52szzC5eA==}
     engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
       typescript: '*'
@@ -2975,6 +3656,37 @@ packages:
       terser:
         optional: true
 
+  vite@5.4.11:
+    resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==}
+    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
+
   vite@5.4.2:
     resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==}
     engines: {node: ^18.0.0 || >=20.0.0}
@@ -3014,15 +3726,15 @@ packages:
       vite:
         optional: true
 
-  vitest@2.0.5:
-    resolution: {integrity: sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==}
+  vitest@2.1.4:
+    resolution: {integrity: sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ==}
     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.0.5
-      '@vitest/ui': 2.0.5
+      '@vitest/browser': 2.1.4
+      '@vitest/ui': 2.1.4
       happy-dom: '*'
       jsdom: '*'
     peerDependenciesMeta:
@@ -3042,11 +3754,11 @@ packages:
   vscode-uri@3.0.8:
     resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==}
 
-  vue-tsc@2.0.29:
-    resolution: {integrity: sha512-MHhsfyxO3mYShZCGYNziSbc63x7cQ5g9kvijV7dRe1TTXBRLxXyL0FnXWpUF1xII2mJ86mwYpYsUmMwkmerq7Q==}
-    hasBin: true
+  vue-eslint-parser@9.4.3:
+    resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==}
+    engines: {node: ^14.17.0 || >=16.0.0}
     peerDependencies:
-      typescript: '>=5.0.0'
+      eslint: '>=6.0.0'
 
   watchpack@2.4.0:
     resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==}
@@ -3101,6 +3813,10 @@ packages:
   wrappy@1.0.2:
     resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
 
+  xml-name-validator@4.0.0:
+    resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
+    engines: {node: '>=12'}
+
   y18n@5.0.8:
     resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
     engines: {node: '>=10'}
@@ -3108,9 +3824,14 @@ 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'}
+  yaml-eslint-parser@1.2.3:
+    resolution: {integrity: sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==}
+    engines: {node: ^14.17.0 || >=16.0.0}
+
+  yaml@2.6.0:
+    resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==}
+    engines: {node: '>= 14'}
+    hasBin: true
 
   yargs-parser@21.1.1:
     resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
@@ -3124,6 +3845,13 @@ packages:
     resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
     engines: {node: '>=10'}
 
+  yocto-queue@1.1.1:
+    resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==}
+    engines: {node: '>=12.20'}
+
+  zwitch@2.0.4:
+    resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
+
 snapshots:
 
   '@ampproject/remapping@2.3.0':
@@ -3131,6 +3859,63 @@ snapshots:
       '@jridgewell/gen-mapping': 0.3.5
       '@jridgewell/trace-mapping': 0.3.25
 
+  '@antfu/eslint-config@3.6.2(@typescript-eslint/utils@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(@vue/compiler-sfc@3.5.12)(eslint-plugin-format@0.1.2(eslint@9.14.0(jiti@1.21.6)))(eslint-plugin-react-hooks@4.6.2(eslint@9.14.0(jiti@1.21.6)))(eslint@9.14.0(jiti@1.21.6))(svelte@4.2.18)(typescript@5.6.3)(vitest@2.1.4)':
+    dependencies:
+      '@antfu/install-pkg': 0.4.1
+      '@clack/prompts': 0.7.0
+      '@eslint-community/eslint-plugin-eslint-comments': 4.4.1(eslint@9.14.0(jiti@1.21.6))
+      '@eslint/markdown': 6.2.1
+      '@stylistic/eslint-plugin': 2.10.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)
+      '@typescript-eslint/eslint-plugin': 8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)
+      '@typescript-eslint/parser': 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)
+      '@vitest/eslint-plugin': 1.1.8(@typescript-eslint/utils@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.4)
+      eslint: 9.14.0(jiti@1.21.6)
+      eslint-config-flat-gitignore: 0.3.0(eslint@9.14.0(jiti@1.21.6))
+      eslint-flat-config-utils: 0.4.0
+      eslint-merge-processors: 0.1.0(eslint@9.14.0(jiti@1.21.6))
+      eslint-plugin-antfu: 2.7.0(eslint@9.14.0(jiti@1.21.6))
+      eslint-plugin-command: 0.2.6(eslint@9.14.0(jiti@1.21.6))
+      eslint-plugin-import-x: 4.4.2(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)
+      eslint-plugin-jsdoc: 50.4.3(eslint@9.14.0(jiti@1.21.6))
+      eslint-plugin-jsonc: 2.18.1(eslint@9.14.0(jiti@1.21.6))
+      eslint-plugin-n: 17.13.1(eslint@9.14.0(jiti@1.21.6))
+      eslint-plugin-no-only-tests: 3.3.0
+      eslint-plugin-perfectionist: 3.9.1(eslint@9.14.0(jiti@1.21.6))(svelte@4.2.18)(typescript@5.6.3)(vue-eslint-parser@9.4.3(eslint@9.14.0(jiti@1.21.6)))
+      eslint-plugin-regexp: 2.6.0(eslint@9.14.0(jiti@1.21.6))
+      eslint-plugin-toml: 0.11.1(eslint@9.14.0(jiti@1.21.6))
+      eslint-plugin-unicorn: 55.0.0(eslint@9.14.0(jiti@1.21.6))
+      eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))
+      eslint-plugin-vue: 9.31.0(eslint@9.14.0(jiti@1.21.6))
+      eslint-plugin-yml: 1.15.0(eslint@9.14.0(jiti@1.21.6))
+      eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.5.12)(eslint@9.14.0(jiti@1.21.6))
+      globals: 15.12.0
+      jsonc-eslint-parser: 2.4.0
+      local-pkg: 0.5.0
+      parse-gitignore: 2.0.0
+      picocolors: 1.1.1
+      toml-eslint-parser: 0.10.0
+      vue-eslint-parser: 9.4.3(eslint@9.14.0(jiti@1.21.6))
+      yaml-eslint-parser: 1.2.3
+      yargs: 17.7.2
+    optionalDependencies:
+      eslint-plugin-format: 0.1.2(eslint@9.14.0(jiti@1.21.6))
+      eslint-plugin-react-hooks: 4.6.2(eslint@9.14.0(jiti@1.21.6))
+    transitivePeerDependencies:
+      - '@eslint/json'
+      - '@typescript-eslint/utils'
+      - '@vue/compiler-sfc'
+      - supports-color
+      - svelte
+      - typescript
+      - vitest
+
+  '@antfu/install-pkg@0.4.1':
+    dependencies:
+      package-manager-detector: 0.2.2
+      tinyexec: 0.3.1
+
+  '@antfu/utils@0.7.10': {}
+
   '@babel/code-frame@7.24.6':
     dependencies:
       '@babel/highlight': 7.24.6
@@ -3138,13 +3923,15 @@ snapshots:
 
   '@babel/helper-string-parser@7.24.8': {}
 
-  '@babel/helper-validator-identifier@7.24.6': {}
+  '@babel/helper-string-parser@7.25.9': {}
 
   '@babel/helper-validator-identifier@7.24.7': {}
 
+  '@babel/helper-validator-identifier@7.25.9': {}
+
   '@babel/highlight@7.24.6':
     dependencies:
-      '@babel/helper-validator-identifier': 7.24.6
+      '@babel/helper-validator-identifier': 7.24.7
       chalk: 2.4.2
       js-tokens: 4.0.0
       picocolors: 1.0.1
@@ -3153,6 +3940,10 @@ snapshots:
     dependencies:
       '@babel/types': 7.25.2
 
+  '@babel/parser@7.26.2':
+    dependencies:
+      '@babel/types': 7.26.0
+
   '@babel/runtime@7.24.7':
     dependencies:
       regenerator-runtime: 0.14.1
@@ -3163,120 +3954,151 @@ snapshots:
       '@babel/helper-validator-identifier': 7.24.7
       to-fast-properties: 2.0.0
 
+  '@babel/types@7.26.0':
+    dependencies:
+      '@babel/helper-string-parser': 7.25.9
+      '@babel/helper-validator-identifier': 7.25.9
+
   '@bcoe/v8-coverage@0.2.3': {}
 
-  '@commitlint/cli@18.6.1(@types/node@22.4.2)(typescript@5.5.4)':
+  '@clack/core@0.3.4':
     dependencies:
-      '@commitlint/format': 18.6.1
-      '@commitlint/lint': 18.6.1
-      '@commitlint/load': 18.6.1(@types/node@22.4.2)(typescript@5.5.4)
-      '@commitlint/read': 18.6.1
-      '@commitlint/types': 18.6.1
-      execa: 5.1.1
-      lodash.isfunction: 3.0.9
-      resolve-from: 5.0.0
-      resolve-global: 1.0.0
+      picocolors: 1.1.1
+      sisteransi: 1.0.5
+
+  '@clack/prompts@0.7.0':
+    dependencies:
+      '@clack/core': 0.3.4
+      picocolors: 1.1.1
+      sisteransi: 1.0.5
+
+  '@commitlint/cli@19.5.0(@types/node@22.4.2)(typescript@5.6.3)':
+    dependencies:
+      '@commitlint/format': 19.5.0
+      '@commitlint/lint': 19.5.0
+      '@commitlint/load': 19.5.0(@types/node@22.4.2)(typescript@5.6.3)
+      '@commitlint/read': 19.5.0
+      '@commitlint/types': 19.5.0
+      tinyexec: 0.3.1
       yargs: 17.7.2
     transitivePeerDependencies:
       - '@types/node'
       - typescript
 
-  '@commitlint/config-conventional@18.6.3':
+  '@commitlint/config-conventional@19.5.0':
     dependencies:
-      '@commitlint/types': 18.6.1
+      '@commitlint/types': 19.5.0
       conventional-changelog-conventionalcommits: 7.0.2
 
-  '@commitlint/config-validator@18.6.1':
+  '@commitlint/config-validator@19.5.0':
     dependencies:
-      '@commitlint/types': 18.6.1
-      ajv: 8.14.0
+      '@commitlint/types': 19.5.0
+      ajv: 8.13.0
 
-  '@commitlint/ensure@18.6.1':
+  '@commitlint/ensure@19.5.0':
     dependencies:
-      '@commitlint/types': 18.6.1
+      '@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@18.6.1': {}
+  '@commitlint/execute-rule@19.5.0': {}
 
-  '@commitlint/format@18.6.1':
+  '@commitlint/format@19.5.0':
     dependencies:
-      '@commitlint/types': 18.6.1
-      chalk: 4.1.2
+      '@commitlint/types': 19.5.0
+      chalk: 5.3.0
 
-  '@commitlint/is-ignored@18.6.1':
+  '@commitlint/is-ignored@19.5.0':
     dependencies:
-      '@commitlint/types': 18.6.1
-      semver: 7.6.0
+      '@commitlint/types': 19.5.0
+      semver: 7.6.3
 
-  '@commitlint/lint@18.6.1':
+  '@commitlint/lint@19.5.0':
     dependencies:
-      '@commitlint/is-ignored': 18.6.1
-      '@commitlint/parse': 18.6.1
-      '@commitlint/rules': 18.6.1
-      '@commitlint/types': 18.6.1
+      '@commitlint/is-ignored': 19.5.0
+      '@commitlint/parse': 19.5.0
+      '@commitlint/rules': 19.5.0
+      '@commitlint/types': 19.5.0
 
-  '@commitlint/load@18.6.1(@types/node@22.4.2)(typescript@5.5.4)':
+  '@commitlint/load@19.5.0(@types/node@22.4.2)(typescript@5.6.3)':
     dependencies:
-      '@commitlint/config-validator': 18.6.1
-      '@commitlint/execute-rule': 18.6.1
-      '@commitlint/resolve-extends': 18.6.1
-      '@commitlint/types': 18.6.1
-      chalk: 4.1.2
-      cosmiconfig: 8.3.6(typescript@5.5.4)
-      cosmiconfig-typescript-loader: 5.0.0(@types/node@22.4.2)(cosmiconfig@8.3.6(typescript@5.5.4))(typescript@5.5.4)
+      '@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.3)
+      cosmiconfig-typescript-loader: 5.1.0(@types/node@22.4.2)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3)
       lodash.isplainobject: 4.0.6
       lodash.merge: 4.6.2
       lodash.uniq: 4.5.0
-      resolve-from: 5.0.0
     transitivePeerDependencies:
       - '@types/node'
       - typescript
 
-  '@commitlint/message@18.6.1': {}
+  '@commitlint/message@19.5.0': {}
 
-  '@commitlint/parse@18.6.1':
+  '@commitlint/parse@19.5.0':
     dependencies:
-      '@commitlint/types': 18.6.1
+      '@commitlint/types': 19.5.0
       conventional-changelog-angular: 7.0.0
       conventional-commits-parser: 5.0.0
 
-  '@commitlint/read@18.6.1':
+  '@commitlint/read@19.5.0':
     dependencies:
-      '@commitlint/top-level': 18.6.1
-      '@commitlint/types': 18.6.1
-      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.1
 
-  '@commitlint/resolve-extends@18.6.1':
+  '@commitlint/resolve-extends@19.5.0':
     dependencies:
-      '@commitlint/config-validator': 18.6.1
-      '@commitlint/types': 18.6.1
-      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@18.6.1':
+  '@commitlint/rules@19.5.0':
     dependencies:
-      '@commitlint/ensure': 18.6.1
-      '@commitlint/message': 18.6.1
-      '@commitlint/to-lines': 18.6.1
-      '@commitlint/types': 18.6.1
-      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@18.6.1': {}
+  '@commitlint/to-lines@19.5.0': {}
 
-  '@commitlint/top-level@18.6.1':
+  '@commitlint/top-level@19.5.0':
     dependencies:
-      find-up: 5.0.0
+      find-up: 7.0.0
 
-  '@commitlint/types@18.6.1':
+  '@commitlint/types@19.5.0':
     dependencies:
-      chalk: 4.1.2
+      '@types/conventional-commits-parser': 5.0.0
+      chalk: 5.3.0
+
+  '@dprint/formatter@0.3.0': {}
+
+  '@dprint/markdown@0.17.8': {}
+
+  '@dprint/toml@0.6.3': {}
+
+  '@es-joy/jsdoccomment@0.48.0':
+    dependencies:
+      comment-parser: 1.4.1
+      esquery: 1.6.0
+      jsdoc-type-pratt-parser: 4.1.0
+
+  '@es-joy/jsdoccomment@0.49.0':
+    dependencies:
+      comment-parser: 1.4.1
+      esquery: 1.6.0
+      jsdoc-type-pratt-parser: 4.1.0
 
   '@esbuild/aix-ppc64@0.20.2':
     optional: true
@@ -3416,18 +4238,45 @@ snapshots:
   '@esbuild/win32-x64@0.21.5':
     optional: true
 
+  '@eslint-community/eslint-plugin-eslint-comments@4.4.1(eslint@9.14.0(jiti@1.21.6))':
+    dependencies:
+      escape-string-regexp: 4.0.0
+      eslint: 9.14.0(jiti@1.21.6)
+      ignore: 5.3.1
+
   '@eslint-community/eslint-utils@4.4.0(eslint@8.55.0)':
     dependencies:
       eslint: 8.55.0
       eslint-visitor-keys: 3.4.3
 
-  '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)':
+  '@eslint-community/eslint-utils@4.4.0(eslint@9.14.0(jiti@1.21.6))':
     dependencies:
-      eslint: 8.57.0
+      eslint: 9.14.0(jiti@1.21.6)
+      eslint-visitor-keys: 3.4.3
+
+  '@eslint-community/eslint-utils@4.4.1(eslint@9.14.0(jiti@1.21.6))':
+    dependencies:
+      eslint: 9.14.0(jiti@1.21.6)
       eslint-visitor-keys: 3.4.3
 
   '@eslint-community/regexpp@4.10.0': {}
 
+  '@eslint-community/regexpp@4.12.1': {}
+
+  '@eslint/compat@1.2.2(eslint@9.14.0(jiti@1.21.6))':
+    optionalDependencies:
+      eslint: 9.14.0(jiti@1.21.6)
+
+  '@eslint/config-array@0.18.0':
+    dependencies:
+      '@eslint/object-schema': 2.1.4
+      debug: 4.3.6
+      minimatch: 3.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  '@eslint/core@0.7.0': {}
+
   '@eslint/eslintrc@2.1.4':
     dependencies:
       ajv: 6.12.6
@@ -3442,9 +4291,45 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
+  '@eslint/eslintrc@3.1.0':
+    dependencies:
+      ajv: 6.12.6
+      debug: 4.3.6
+      espree: 10.3.0
+      globals: 14.0.0
+      ignore: 5.3.1
+      import-fresh: 3.3.0
+      js-yaml: 4.1.0
+      minimatch: 3.1.2
+      strip-json-comments: 3.1.1
+    transitivePeerDependencies:
+      - supports-color
+
   '@eslint/js@8.55.0': {}
 
-  '@eslint/js@8.57.0': {}
+  '@eslint/js@9.14.0': {}
+
+  '@eslint/markdown@6.2.1':
+    dependencies:
+      '@eslint/plugin-kit': 0.2.2
+      mdast-util-from-markdown: 2.0.2
+      mdast-util-gfm: 3.0.0
+      micromark-extension-gfm: 3.0.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@eslint/object-schema@2.1.4': {}
+
+  '@eslint/plugin-kit@0.2.2':
+    dependencies:
+      levn: 0.4.1
+
+  '@humanfs/core@0.19.1': {}
+
+  '@humanfs/node@0.16.6':
+    dependencies:
+      '@humanfs/core': 0.19.1
+      '@humanwhocodes/retry': 0.3.1
 
   '@humanwhocodes/config-array@0.11.14':
     dependencies:
@@ -3458,6 +4343,10 @@ snapshots:
 
   '@humanwhocodes/object-schema@2.0.3': {}
 
+  '@humanwhocodes/retry@0.3.1': {}
+
+  '@humanwhocodes/retry@0.4.1': {}
+
   '@isaacs/cliui@8.0.2':
     dependencies:
       string-width: 5.1.2
@@ -3488,23 +4377,23 @@ snapshots:
       '@jridgewell/resolve-uri': 3.1.2
       '@jridgewell/sourcemap-codec': 1.4.15
 
-  '@microsoft/api-extractor-model@7.29.4(@types/node@22.4.2)':
+  '@microsoft/api-extractor-model@7.29.8(@types/node@22.4.2)':
     dependencies:
       '@microsoft/tsdoc': 0.15.0
       '@microsoft/tsdoc-config': 0.17.0
-      '@rushstack/node-core-library': 5.5.1(@types/node@22.4.2)
+      '@rushstack/node-core-library': 5.9.0(@types/node@22.4.2)
     transitivePeerDependencies:
       - '@types/node'
 
-  '@microsoft/api-extractor@7.47.4(@types/node@22.4.2)':
+  '@microsoft/api-extractor@7.47.11(@types/node@22.4.2)':
     dependencies:
-      '@microsoft/api-extractor-model': 7.29.4(@types/node@22.4.2)
+      '@microsoft/api-extractor-model': 7.29.8(@types/node@22.4.2)
       '@microsoft/tsdoc': 0.15.0
       '@microsoft/tsdoc-config': 0.17.0
-      '@rushstack/node-core-library': 5.5.1(@types/node@22.4.2)
+      '@rushstack/node-core-library': 5.9.0(@types/node@22.4.2)
       '@rushstack/rig-package': 0.5.3
-      '@rushstack/terminal': 0.13.3(@types/node@22.4.2)
-      '@rushstack/ts-command-line': 4.22.3(@types/node@22.4.2)
+      '@rushstack/terminal': 0.14.2(@types/node@22.4.2)
+      '@rushstack/ts-command-line': 4.23.0(@types/node@22.4.2)
       lodash: 4.17.21
       minimatch: 3.0.8
       resolve: 1.22.8
@@ -3571,6 +4460,8 @@ snapshots:
   '@pkgjs/parseargs@0.11.0':
     optional: true
 
+  '@pkgr/core@0.1.1': {}
+
   '@polka/url@1.0.0-next.25': {}
 
   '@rollup/pluginutils@5.1.0(rollup@4.21.0)':
@@ -3679,7 +4570,7 @@ snapshots:
 
   '@rushstack/eslint-patch@1.10.3': {}
 
-  '@rushstack/node-core-library@5.5.1(@types/node@22.4.2)':
+  '@rushstack/node-core-library@5.9.0(@types/node@22.4.2)':
     dependencies:
       ajv: 8.13.0
       ajv-draft-04: 1.0.0(ajv@8.13.0)
@@ -3697,22 +4588,60 @@ snapshots:
       resolve: 1.22.8
       strip-json-comments: 3.1.1
 
-  '@rushstack/terminal@0.13.3(@types/node@22.4.2)':
+  '@rushstack/terminal@0.14.2(@types/node@22.4.2)':
     dependencies:
-      '@rushstack/node-core-library': 5.5.1(@types/node@22.4.2)
+      '@rushstack/node-core-library': 5.9.0(@types/node@22.4.2)
       supports-color: 8.1.1
     optionalDependencies:
       '@types/node': 22.4.2
 
-  '@rushstack/ts-command-line@4.22.3(@types/node@22.4.2)':
+  '@rushstack/ts-command-line@4.23.0(@types/node@22.4.2)':
     dependencies:
-      '@rushstack/terminal': 0.13.3(@types/node@22.4.2)
+      '@rushstack/terminal': 0.14.2(@types/node@22.4.2)
       '@types/argparse': 1.0.38
       argparse: 1.0.10
       string-argv: 0.3.2
     transitivePeerDependencies:
       - '@types/node'
 
+  '@storyblok/eslint-config@0.3.0(@typescript-eslint/utils@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(@vue/compiler-sfc@3.5.12)(eslint-plugin-react-hooks@4.6.2(eslint@9.14.0(jiti@1.21.6)))(eslint@9.14.0(jiti@1.21.6))(svelte@4.2.18)(typescript@5.6.3)(vitest@2.1.4)':
+    dependencies:
+      '@antfu/eslint-config': 3.6.2(@typescript-eslint/utils@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(@vue/compiler-sfc@3.5.12)(eslint-plugin-format@0.1.2(eslint@9.14.0(jiti@1.21.6)))(eslint-plugin-react-hooks@4.6.2(eslint@9.14.0(jiti@1.21.6)))(eslint@9.14.0(jiti@1.21.6))(svelte@4.2.18)(typescript@5.6.3)(vitest@2.1.4)
+      eslint: 9.14.0(jiti@1.21.6)
+      eslint-plugin-format: 0.1.2(eslint@9.14.0(jiti@1.21.6))
+    transitivePeerDependencies:
+      - '@eslint-react/eslint-plugin'
+      - '@eslint/json'
+      - '@prettier/plugin-xml'
+      - '@typescript-eslint/utils'
+      - '@unocss/eslint-plugin'
+      - '@vue/compiler-sfc'
+      - astro-eslint-parser
+      - eslint-plugin-astro
+      - eslint-plugin-react-hooks
+      - eslint-plugin-react-refresh
+      - eslint-plugin-solid
+      - eslint-plugin-svelte
+      - prettier-plugin-astro
+      - prettier-plugin-slidev
+      - supports-color
+      - svelte
+      - svelte-eslint-parser
+      - typescript
+      - vitest
+
+  '@stylistic/eslint-plugin@2.10.1(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)':
+    dependencies:
+      '@typescript-eslint/utils': 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)
+      eslint: 9.14.0(jiti@1.21.6)
+      eslint-visitor-keys: 4.2.0
+      espree: 10.3.0
+      estraverse: 5.3.0
+      picomatch: 4.0.2
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+
   '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.4.2(@types/node@22.4.2)))(svelte@4.2.18)(vite@5.4.2(@types/node@22.4.2))':
     dependencies:
       '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.18)(vite@5.4.2(@types/node@22.4.2))
@@ -3740,19 +4669,33 @@ snapshots:
     dependencies:
       tslib: 2.6.3
 
-  '@tsconfig/recommended@1.0.7': {}
+  '@tsconfig/recommended@1.0.8': {}
 
   '@tsconfig/svelte@5.0.4': {}
 
   '@types/argparse@1.0.38': {}
 
+  '@types/conventional-commits-parser@5.0.0':
+    dependencies:
+      '@types/node': 22.4.2
+
+  '@types/debug@4.1.12':
+    dependencies:
+      '@types/ms': 0.7.34
+
   '@types/estree@1.0.5': {}
 
+  '@types/estree@1.0.6': {}
+
   '@types/json-schema@7.0.15': {}
 
   '@types/json5@0.0.29': {}
 
-  '@types/minimist@1.2.5': {}
+  '@types/mdast@4.0.4':
+    dependencies:
+      '@types/unist': 3.0.3
+
+  '@types/ms@0.7.34': {}
 
   '@types/node@22.4.2':
     dependencies:
@@ -3770,51 +4713,49 @@ snapshots:
 
   '@types/scheduler@0.23.0': {}
 
-  '@types/semver@7.5.8': {}
+  '@types/unist@3.0.3': {}
 
-  '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)':
+  '@typescript-eslint/eslint-plugin@8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)':
     dependencies:
       '@eslint-community/regexpp': 4.10.0
-      '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.4)
-      '@typescript-eslint/scope-manager': 6.21.0
-      '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.5.4)
-      '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.5.4)
-      '@typescript-eslint/visitor-keys': 6.21.0
-      debug: 4.3.4
-      eslint: 8.57.0
+      '@typescript-eslint/parser': 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)
+      '@typescript-eslint/scope-manager': 8.14.0
+      '@typescript-eslint/type-utils': 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)
+      '@typescript-eslint/utils': 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)
+      '@typescript-eslint/visitor-keys': 8.14.0
+      eslint: 9.14.0(jiti@1.21.6)
       graphemer: 1.4.0
       ignore: 5.3.1
       natural-compare: 1.4.0
-      semver: 7.6.2
-      ts-api-utils: 1.3.0(typescript@5.5.4)
+      ts-api-utils: 1.3.0(typescript@5.6.3)
     optionalDependencies:
-      typescript: 5.5.4
+      typescript: 5.6.3
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.5.4)':
+  '@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.6.3)':
     dependencies:
       '@typescript-eslint/scope-manager': 6.21.0
       '@typescript-eslint/types': 6.21.0
-      '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4)
+      '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.6.3)
       '@typescript-eslint/visitor-keys': 6.21.0
       debug: 4.3.4
       eslint: 8.55.0
     optionalDependencies:
-      typescript: 5.5.4
+      typescript: 5.6.3
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4)':
+  '@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)':
     dependencies:
-      '@typescript-eslint/scope-manager': 6.21.0
-      '@typescript-eslint/types': 6.21.0
-      '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4)
-      '@typescript-eslint/visitor-keys': 6.21.0
-      debug: 4.3.4
-      eslint: 8.57.0
+      '@typescript-eslint/scope-manager': 8.14.0
+      '@typescript-eslint/types': 8.14.0
+      '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.6.3)
+      '@typescript-eslint/visitor-keys': 8.14.0
+      debug: 4.3.6
+      eslint: 9.14.0(jiti@1.21.6)
     optionalDependencies:
-      typescript: 5.5.4
+      typescript: 5.6.3
     transitivePeerDependencies:
       - supports-color
 
@@ -3823,21 +4764,28 @@ snapshots:
       '@typescript-eslint/types': 6.21.0
       '@typescript-eslint/visitor-keys': 6.21.0
 
-  '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.5.4)':
+  '@typescript-eslint/scope-manager@8.14.0':
     dependencies:
-      '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4)
-      '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.5.4)
-      debug: 4.3.4
-      eslint: 8.57.0
-      ts-api-utils: 1.3.0(typescript@5.5.4)
+      '@typescript-eslint/types': 8.14.0
+      '@typescript-eslint/visitor-keys': 8.14.0
+
+  '@typescript-eslint/type-utils@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)':
+    dependencies:
+      '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.6.3)
+      '@typescript-eslint/utils': 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)
+      debug: 4.3.6
+      ts-api-utils: 1.3.0(typescript@5.6.3)
     optionalDependencies:
-      typescript: 5.5.4
+      typescript: 5.6.3
     transitivePeerDependencies:
+      - eslint
       - supports-color
 
   '@typescript-eslint/types@6.21.0': {}
 
-  '@typescript-eslint/typescript-estree@6.21.0(typescript@5.5.4)':
+  '@typescript-eslint/types@8.14.0': {}
+
+  '@typescript-eslint/typescript-estree@6.21.0(typescript@5.6.3)':
     dependencies:
       '@typescript-eslint/types': 6.21.0
       '@typescript-eslint/visitor-keys': 6.21.0
@@ -3846,22 +4794,34 @@ snapshots:
       is-glob: 4.0.3
       minimatch: 9.0.3
       semver: 7.6.2
-      ts-api-utils: 1.3.0(typescript@5.5.4)
+      ts-api-utils: 1.3.0(typescript@5.6.3)
     optionalDependencies:
-      typescript: 5.5.4
+      typescript: 5.6.3
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.5.4)':
+  '@typescript-eslint/typescript-estree@8.14.0(typescript@5.6.3)':
     dependencies:
-      '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
-      '@types/json-schema': 7.0.15
-      '@types/semver': 7.5.8
-      '@typescript-eslint/scope-manager': 6.21.0
-      '@typescript-eslint/types': 6.21.0
-      '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4)
-      eslint: 8.57.0
-      semver: 7.6.2
+      '@typescript-eslint/types': 8.14.0
+      '@typescript-eslint/visitor-keys': 8.14.0
+      debug: 4.3.6
+      fast-glob: 3.3.2
+      is-glob: 4.0.3
+      minimatch: 9.0.5
+      semver: 7.6.3
+      ts-api-utils: 1.3.0(typescript@5.6.3)
+    optionalDependencies:
+      typescript: 5.6.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/utils@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)':
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.0(eslint@9.14.0(jiti@1.21.6))
+      '@typescript-eslint/scope-manager': 8.14.0
+      '@typescript-eslint/types': 8.14.0
+      '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.6.3)
+      eslint: 9.14.0(jiti@1.21.6)
     transitivePeerDependencies:
       - supports-color
       - typescript
@@ -3871,79 +4831,99 @@ snapshots:
       '@typescript-eslint/types': 6.21.0
       eslint-visitor-keys: 3.4.3
 
+  '@typescript-eslint/visitor-keys@8.14.0':
+    dependencies:
+      '@typescript-eslint/types': 8.14.0
+      eslint-visitor-keys: 3.4.3
+
   '@ungap/structured-clone@1.2.0': {}
 
-  '@vitest/coverage-v8@2.0.5(vitest@2.0.5(@types/node@22.4.2)(@vitest/ui@2.0.5))':
+  '@vitest/coverage-v8@2.1.4(vitest@2.1.4)':
     dependencies:
       '@ampproject/remapping': 2.3.0
       '@bcoe/v8-coverage': 0.2.3
-      debug: 4.3.6
+      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.4
+      magic-string: 0.30.12
+      magicast: 0.3.5
       std-env: 3.7.0
       test-exclude: 7.0.1
       tinyrainbow: 1.2.0
-      vitest: 2.0.5(@types/node@22.4.2)(@vitest/ui@2.0.5)
+      vitest: 2.1.4(@types/node@22.4.2)(@vitest/ui@2.1.4)
     transitivePeerDependencies:
       - supports-color
 
-  '@vitest/expect@2.0.5':
+  '@vitest/eslint-plugin@1.1.8(@typescript-eslint/utils@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.4)':
     dependencies:
-      '@vitest/spy': 2.0.5
-      '@vitest/utils': 2.0.5
-      chai: 5.1.1
+      '@typescript-eslint/utils': 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)
+      eslint: 9.14.0(jiti@1.21.6)
+    optionalDependencies:
+      typescript: 5.6.3
+      vitest: 2.1.4(@types/node@22.4.2)(@vitest/ui@2.1.4)
+
+  '@vitest/expect@2.1.4':
+    dependencies:
+      '@vitest/spy': 2.1.4
+      '@vitest/utils': 2.1.4
+      chai: 5.1.2
       tinyrainbow: 1.2.0
 
-  '@vitest/pretty-format@2.0.5':
+  '@vitest/mocker@2.1.4(vite@5.4.11(@types/node@22.4.2))':
+    dependencies:
+      '@vitest/spy': 2.1.4
+      estree-walker: 3.0.3
+      magic-string: 0.30.12
+    optionalDependencies:
+      vite: 5.4.11(@types/node@22.4.2)
+
+  '@vitest/pretty-format@2.1.4':
     dependencies:
       tinyrainbow: 1.2.0
 
-  '@vitest/runner@2.0.5':
+  '@vitest/runner@2.1.4':
     dependencies:
-      '@vitest/utils': 2.0.5
+      '@vitest/utils': 2.1.4
       pathe: 1.1.2
 
-  '@vitest/snapshot@2.0.5':
+  '@vitest/snapshot@2.1.4':
     dependencies:
-      '@vitest/pretty-format': 2.0.5
-      magic-string: 0.30.11
+      '@vitest/pretty-format': 2.1.4
+      magic-string: 0.30.12
       pathe: 1.1.2
 
-  '@vitest/spy@2.0.5':
+  '@vitest/spy@2.1.4':
     dependencies:
-      tinyspy: 3.0.0
+      tinyspy: 3.0.2
 
-  '@vitest/ui@2.0.5(vitest@2.0.5)':
+  '@vitest/ui@2.1.4(vitest@2.1.4)':
     dependencies:
-      '@vitest/utils': 2.0.5
-      fast-glob: 3.3.2
+      '@vitest/utils': 2.1.4
       fflate: 0.8.2
       flatted: 3.3.1
       pathe: 1.1.2
-      sirv: 2.0.4
+      sirv: 3.0.0
+      tinyglobby: 0.2.10
       tinyrainbow: 1.2.0
-      vitest: 2.0.5(@types/node@22.4.2)(@vitest/ui@2.0.5)
+      vitest: 2.1.4(@types/node@22.4.2)(@vitest/ui@2.1.4)
 
-  '@vitest/utils@2.0.5':
+  '@vitest/utils@2.1.4':
     dependencies:
-      '@vitest/pretty-format': 2.0.5
-      estree-walker: 3.0.3
-      loupe: 3.1.1
+      '@vitest/pretty-format': 2.1.4
+      loupe: 3.1.2
       tinyrainbow: 1.2.0
 
-  '@volar/language-core@2.4.0':
+  '@volar/language-core@2.4.10':
     dependencies:
-      '@volar/source-map': 2.4.0
+      '@volar/source-map': 2.4.10
 
-  '@volar/source-map@2.4.0': {}
+  '@volar/source-map@2.4.10': {}
 
-  '@volar/typescript@2.4.0':
+  '@volar/typescript@2.4.10':
     dependencies:
-      '@volar/language-core': 2.4.0
+      '@volar/language-core': 2.4.10
       path-browserify: 1.0.1
       vscode-uri: 3.0.8
 
@@ -3955,19 +4935,49 @@ snapshots:
       estree-walker: 2.0.2
       source-map-js: 1.2.0
 
+  '@vue/compiler-core@3.5.12':
+    dependencies:
+      '@babel/parser': 7.26.2
+      '@vue/shared': 3.5.12
+      entities: 4.5.0
+      estree-walker: 2.0.2
+      source-map-js: 1.2.1
+
   '@vue/compiler-dom@3.4.38':
     dependencies:
       '@vue/compiler-core': 3.4.38
       '@vue/shared': 3.4.38
 
+  '@vue/compiler-dom@3.5.12':
+    dependencies:
+      '@vue/compiler-core': 3.5.12
+      '@vue/shared': 3.5.12
+
+  '@vue/compiler-sfc@3.5.12':
+    dependencies:
+      '@babel/parser': 7.26.2
+      '@vue/compiler-core': 3.5.12
+      '@vue/compiler-dom': 3.5.12
+      '@vue/compiler-ssr': 3.5.12
+      '@vue/shared': 3.5.12
+      estree-walker: 2.0.2
+      magic-string: 0.30.12
+      postcss: 8.4.49
+      source-map-js: 1.2.1
+
+  '@vue/compiler-ssr@3.5.12':
+    dependencies:
+      '@vue/compiler-dom': 3.5.12
+      '@vue/shared': 3.5.12
+
   '@vue/compiler-vue2@2.7.16':
     dependencies:
       de-indent: 1.0.2
       he: 1.2.0
 
-  '@vue/language-core@2.0.29(typescript@5.5.4)':
+  '@vue/language-core@2.1.6(typescript@5.6.3)':
     dependencies:
-      '@volar/language-core': 2.4.0
+      '@volar/language-core': 2.4.10
       '@vue/compiler-dom': 3.4.38
       '@vue/compiler-vue2': 2.7.16
       '@vue/shared': 3.4.38
@@ -3976,10 +4986,12 @@ snapshots:
       muggle-string: 0.4.1
       path-browserify: 1.0.1
     optionalDependencies:
-      typescript: 5.5.4
+      typescript: 5.6.3
 
   '@vue/shared@3.4.38': {}
 
+  '@vue/shared@3.5.12': {}
+
   JSONStream@1.3.5:
     dependencies:
       jsonparse: 1.3.1
@@ -3989,10 +5001,16 @@ snapshots:
     dependencies:
       acorn: 8.11.3
 
+  acorn-jsx@5.3.2(acorn@8.14.0):
+    dependencies:
+      acorn: 8.14.0
+
   acorn@8.11.3: {}
 
   acorn@8.12.1: {}
 
+  acorn@8.14.0: {}
+
   ajv-draft-04@1.0.0(ajv@8.13.0):
     optionalDependencies:
       ajv: 8.13.0
@@ -4022,13 +5040,6 @@ snapshots:
       require-from-string: 2.0.2
       uri-js: 4.4.1
 
-  ajv@8.14.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
-
   ansi-regex@5.0.1: {}
 
   ansi-regex@6.0.1: {}
@@ -4043,6 +5054,8 @@ snapshots:
 
   ansi-styles@6.2.1: {}
 
+  are-docs-informative@0.0.2: {}
+
   argparse@1.0.10:
     dependencies:
       sprintf-js: 1.0.3
@@ -4129,8 +5142,6 @@ snapshots:
       is-array-buffer: 3.0.4
       is-shared-array-buffer: 1.0.3
 
-  arrify@1.0.1: {}
-
   assertion-error@2.0.1: {}
 
   ast-types-flow@0.0.8: {}
@@ -4151,6 +5162,8 @@ snapshots:
 
   balanced-match@1.0.2: {}
 
+  boolbase@1.0.0: {}
+
   brace-expansion@1.1.11:
     dependencies:
       balanced-match: 1.0.2
@@ -4164,6 +5177,15 @@ snapshots:
     dependencies:
       fill-range: 7.1.1
 
+  browserslist@4.24.2:
+    dependencies:
+      caniuse-lite: 1.0.30001680
+      electron-to-chromium: 1.5.56
+      node-releases: 2.0.18
+      update-browserslist-db: 1.1.1(browserslist@4.24.2)
+
+  builtin-modules@3.3.0: {}
+
   busboy@1.6.0:
     dependencies:
       streamsearch: 1.1.0
@@ -4180,17 +5202,13 @@ snapshots:
 
   callsites@3.1.0: {}
 
-  camelcase-keys@6.2.2:
-    dependencies:
-      camelcase: 5.3.1
-      map-obj: 4.3.0
-      quick-lru: 4.0.1
+  caniuse-lite@1.0.30001632: {}
 
-  camelcase@5.3.1: {}
+  caniuse-lite@1.0.30001680: {}
 
-  caniuse-lite@1.0.30001632: {}
+  ccount@2.0.1: {}
 
-  chai@5.1.1:
+  chai@5.1.2:
     dependencies:
       assertion-error: 2.0.1
       check-error: 2.1.1
@@ -4209,8 +5227,18 @@ snapshots:
       ansi-styles: 4.3.0
       supports-color: 7.2.0
 
+  chalk@5.3.0: {}
+
+  character-entities@2.0.2: {}
+
   check-error@2.1.1: {}
 
+  ci-info@4.0.0: {}
+
+  clean-regexp@1.0.0:
+    dependencies:
+      escape-string-regexp: 1.0.5
+
   client-only@0.0.1: {}
 
   cliui@8.0.1:
@@ -4239,6 +5267,8 @@ snapshots:
 
   color-name@1.1.4: {}
 
+  comment-parser@1.4.1: {}
+
   compare-func@2.0.0:
     dependencies:
       array-ify: 1.0.0
@@ -4267,21 +5297,25 @@ snapshots:
       meow: 12.1.1
       split2: 4.2.0
 
-  cosmiconfig-typescript-loader@5.0.0(@types/node@22.4.2)(cosmiconfig@8.3.6(typescript@5.5.4))(typescript@5.5.4):
+  core-js-compat@3.39.0:
+    dependencies:
+      browserslist: 4.24.2
+
+  cosmiconfig-typescript-loader@5.1.0(@types/node@22.4.2)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3):
     dependencies:
       '@types/node': 22.4.2
-      cosmiconfig: 8.3.6(typescript@5.5.4)
-      jiti: 1.21.0
-      typescript: 5.5.4
+      cosmiconfig: 9.0.0(typescript@5.6.3)
+      jiti: 1.21.6
+      typescript: 5.6.3
 
-  cosmiconfig@8.3.6(typescript@5.5.4):
+  cosmiconfig@9.0.0(typescript@5.6.3):
     dependencies:
+      env-paths: 2.2.1
       import-fresh: 3.3.0
       js-yaml: 4.1.0
       parse-json: 5.2.0
-      path-type: 4.0.0
     optionalDependencies:
-      typescript: 5.5.4
+      typescript: 5.6.3
 
   cross-spawn@7.0.3:
     dependencies:
@@ -4294,11 +5328,13 @@ snapshots:
       mdn-data: 2.0.30
       source-map-js: 1.2.0
 
+  cssesc@3.0.0: {}
+
   csstype@3.1.3: {}
 
   damerau-levenshtein@1.0.8: {}
 
-  dargs@7.0.0: {}
+  dargs@8.1.0: {}
 
   data-view-buffer@1.0.1:
     dependencies:
@@ -4332,12 +5368,13 @@ snapshots:
     dependencies:
       ms: 2.1.2
 
-  decamelize-keys@1.1.1:
+  debug@4.3.7:
     dependencies:
-      decamelize: 1.2.0
-      map-obj: 1.0.1
+      ms: 2.1.3
 
-  decamelize@1.2.0: {}
+  decode-named-character-reference@1.0.2:
+    dependencies:
+      character-entities: 2.0.2
 
   deep-eql@5.0.2: {}
 
@@ -4359,6 +5396,10 @@ snapshots:
 
   dequal@2.0.3: {}
 
+  devlop@1.1.0:
+    dependencies:
+      dequal: 2.0.3
+
   dir-glob@3.0.1:
     dependencies:
       path-type: 4.0.0
@@ -4377,6 +5418,8 @@ snapshots:
 
   eastasianwidth@0.2.0: {}
 
+  electron-to-chromium@1.5.56: {}
+
   emoji-regex@8.0.0: {}
 
   emoji-regex@9.2.2: {}
@@ -4386,8 +5429,15 @@ snapshots:
       graceful-fs: 4.2.11
       tapable: 2.2.1
 
+  enhanced-resolve@5.17.1:
+    dependencies:
+      graceful-fs: 4.2.11
+      tapable: 2.2.1
+
   entities@4.5.0: {}
 
+  env-paths@2.2.1: {}
+
   error-ex@1.3.2:
     dependencies:
       is-arrayish: 0.2.1
@@ -4464,6 +5514,8 @@ snapshots:
       iterator.prototype: 1.1.2
       safe-array-concat: 1.1.2
 
+  es-module-lexer@1.5.4: {}
+
   es-object-atoms@1.0.0:
     dependencies:
       es-errors: 1.3.0
@@ -4538,31 +5590,60 @@ snapshots:
 
   escalade@3.1.2: {}
 
+  escalade@3.2.0: {}
+
   escape-string-regexp@1.0.5: {}
 
   escape-string-regexp@4.0.0: {}
 
-  eslint-config-next@14.0.4(eslint@8.55.0)(typescript@5.5.4):
+  escape-string-regexp@5.0.0: {}
+
+  eslint-compat-utils@0.5.1(eslint@9.14.0(jiti@1.21.6)):
+    dependencies:
+      eslint: 9.14.0(jiti@1.21.6)
+      semver: 7.6.3
+
+  eslint-compat-utils@0.6.0(eslint@9.14.0(jiti@1.21.6)):
+    dependencies:
+      eslint: 9.14.0(jiti@1.21.6)
+      semver: 7.6.3
+
+  eslint-config-flat-gitignore@0.3.0(eslint@9.14.0(jiti@1.21.6)):
+    dependencies:
+      '@eslint/compat': 1.2.2(eslint@9.14.0(jiti@1.21.6))
+      eslint: 9.14.0(jiti@1.21.6)
+      find-up-simple: 1.0.0
+
+  eslint-config-next@14.0.4(eslint@8.55.0)(typescript@5.6.3):
     dependencies:
       '@next/eslint-plugin-next': 14.0.4
       '@rushstack/eslint-patch': 1.10.3
-      '@typescript-eslint/parser': 6.21.0(eslint@8.55.0)(typescript@5.5.4)
+      '@typescript-eslint/parser': 6.21.0(eslint@8.55.0)(typescript@5.6.3)
       eslint: 8.55.0
       eslint-import-resolver-node: 0.3.9
-      eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.55.0))(eslint@8.55.0)
-      eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.55.0))(eslint@8.55.0))(eslint@8.55.0)
+      eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.55.0)
+      eslint-plugin-import: 2.29.1(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@8.55.0)
       eslint-plugin-jsx-a11y: 6.8.0(eslint@8.55.0)
       eslint-plugin-react: 7.34.2(eslint@8.55.0)
       eslint-plugin-react-hooks: 4.6.2(eslint@8.55.0)
     optionalDependencies:
-      typescript: 5.5.4
+      typescript: 5.6.3
     transitivePeerDependencies:
       - eslint-import-resolver-webpack
       - supports-color
 
-  eslint-config-prettier@9.1.0(eslint@8.57.0):
+  eslint-config-prettier@9.1.0(eslint@9.14.0(jiti@1.21.6)):
+    dependencies:
+      eslint: 9.14.0(jiti@1.21.6)
+
+  eslint-flat-config-utils@0.4.0:
     dependencies:
-      eslint: 8.57.0
+      pathe: 1.1.2
+
+  eslint-formatting-reporter@0.0.0(eslint@9.14.0(jiti@1.21.6)):
+    dependencies:
+      eslint: 9.14.0(jiti@1.21.6)
+      prettier-linter-helpers: 1.0.0
 
   eslint-import-resolver-node@0.3.9:
     dependencies:
@@ -4572,13 +5653,13 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.55.0))(eslint@8.55.0):
+  eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.55.0):
     dependencies:
       debug: 4.3.4
       enhanced-resolve: 5.17.0
       eslint: 8.55.0
-      eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.55.0))(eslint@8.55.0))(eslint@8.55.0)
-      eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.55.0))(eslint@8.55.0))(eslint@8.55.0)
+      eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.55.0)
+      eslint-plugin-import: 2.29.1(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@8.55.0)
       fast-glob: 3.3.2
       get-tsconfig: 4.7.5
       is-core-module: 2.13.1
@@ -4589,18 +5670,85 @@ snapshots:
       - eslint-import-resolver-webpack
       - supports-color
 
-  eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.55.0))(eslint@8.55.0))(eslint@8.55.0):
+  eslint-json-compat-utils@0.2.1(eslint@9.14.0(jiti@1.21.6))(jsonc-eslint-parser@2.4.0):
+    dependencies:
+      eslint: 9.14.0(jiti@1.21.6)
+      esquery: 1.6.0
+      jsonc-eslint-parser: 2.4.0
+
+  eslint-merge-processors@0.1.0(eslint@9.14.0(jiti@1.21.6)):
+    dependencies:
+      eslint: 9.14.0(jiti@1.21.6)
+
+  eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.55.0):
+    dependencies:
+      debug: 3.2.7
+    optionalDependencies:
+      '@typescript-eslint/parser': 6.21.0(eslint@8.55.0)(typescript@5.6.3)
+      eslint: 8.55.0
+      eslint-import-resolver-node: 0.3.9
+      eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.55.0)
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-module-utils@2.8.1(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@8.55.0):
     dependencies:
       debug: 3.2.7
     optionalDependencies:
-      '@typescript-eslint/parser': 6.21.0(eslint@8.55.0)(typescript@5.5.4)
+      '@typescript-eslint/parser': 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)
       eslint: 8.55.0
       eslint-import-resolver-node: 0.3.9
-      eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.55.0))(eslint@8.55.0)
     transitivePeerDependencies:
       - supports-color
 
-  eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.55.0))(eslint@8.55.0))(eslint@8.55.0):
+  eslint-parser-plain@0.1.0: {}
+
+  eslint-plugin-antfu@2.7.0(eslint@9.14.0(jiti@1.21.6)):
+    dependencies:
+      '@antfu/utils': 0.7.10
+      eslint: 9.14.0(jiti@1.21.6)
+
+  eslint-plugin-command@0.2.6(eslint@9.14.0(jiti@1.21.6)):
+    dependencies:
+      '@es-joy/jsdoccomment': 0.48.0
+      eslint: 9.14.0(jiti@1.21.6)
+
+  eslint-plugin-es-x@7.8.0(eslint@9.14.0(jiti@1.21.6)):
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.1(eslint@9.14.0(jiti@1.21.6))
+      '@eslint-community/regexpp': 4.12.1
+      eslint: 9.14.0(jiti@1.21.6)
+      eslint-compat-utils: 0.5.1(eslint@9.14.0(jiti@1.21.6))
+
+  eslint-plugin-format@0.1.2(eslint@9.14.0(jiti@1.21.6)):
+    dependencies:
+      '@dprint/formatter': 0.3.0
+      '@dprint/markdown': 0.17.8
+      '@dprint/toml': 0.6.3
+      eslint: 9.14.0(jiti@1.21.6)
+      eslint-formatting-reporter: 0.0.0(eslint@9.14.0(jiti@1.21.6))
+      eslint-parser-plain: 0.1.0
+      prettier: 3.3.3
+      synckit: 0.9.2
+
+  eslint-plugin-import-x@4.4.2(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3):
+    dependencies:
+      '@typescript-eslint/utils': 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)
+      debug: 4.3.7
+      doctrine: 3.0.0
+      eslint: 9.14.0(jiti@1.21.6)
+      eslint-import-resolver-node: 0.3.9
+      get-tsconfig: 4.7.5
+      is-glob: 4.0.3
+      minimatch: 9.0.5
+      semver: 7.6.3
+      stable-hash: 0.0.4
+      tslib: 2.6.3
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+
+  eslint-plugin-import@2.29.1(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@8.55.0):
     dependencies:
       array-includes: 3.1.8
       array.prototype.findlastindex: 1.2.5
@@ -4610,7 +5758,7 @@ snapshots:
       doctrine: 2.1.0
       eslint: 8.55.0
       eslint-import-resolver-node: 0.3.9
-      eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.55.0))(eslint@8.55.0))(eslint@8.55.0)
+      eslint-module-utils: 2.8.1(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@8.55.0)
       hasown: 2.0.2
       is-core-module: 2.13.1
       is-glob: 4.0.3
@@ -4621,12 +5769,43 @@ snapshots:
       semver: 6.3.1
       tsconfig-paths: 3.15.0
     optionalDependencies:
-      '@typescript-eslint/parser': 6.21.0(eslint@8.55.0)(typescript@5.5.4)
+      '@typescript-eslint/parser': 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)
     transitivePeerDependencies:
       - eslint-import-resolver-typescript
       - eslint-import-resolver-webpack
       - supports-color
 
+  eslint-plugin-jsdoc@50.4.3(eslint@9.14.0(jiti@1.21.6)):
+    dependencies:
+      '@es-joy/jsdoccomment': 0.49.0
+      are-docs-informative: 0.0.2
+      comment-parser: 1.4.1
+      debug: 4.3.7
+      escape-string-regexp: 4.0.0
+      eslint: 9.14.0(jiti@1.21.6)
+      espree: 10.3.0
+      esquery: 1.6.0
+      parse-imports: 2.2.1
+      semver: 7.6.3
+      spdx-expression-parse: 4.0.0
+      synckit: 0.9.2
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-plugin-jsonc@2.18.1(eslint@9.14.0(jiti@1.21.6)):
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.0(eslint@9.14.0(jiti@1.21.6))
+      eslint: 9.14.0(jiti@1.21.6)
+      eslint-compat-utils: 0.6.0(eslint@9.14.0(jiti@1.21.6))
+      eslint-json-compat-utils: 0.2.1(eslint@9.14.0(jiti@1.21.6))(jsonc-eslint-parser@2.4.0)
+      espree: 9.6.1
+      graphemer: 1.4.0
+      jsonc-eslint-parser: 2.4.0
+      natural-compare: 1.4.0
+      synckit: 0.6.2
+    transitivePeerDependencies:
+      - '@eslint/json'
+
   eslint-plugin-jsx-a11y@6.8.0(eslint@8.55.0):
     dependencies:
       '@babel/runtime': 7.24.7
@@ -4647,10 +5826,43 @@ snapshots:
       object.entries: 1.1.8
       object.fromentries: 2.0.8
 
+  eslint-plugin-n@17.13.1(eslint@9.14.0(jiti@1.21.6)):
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.1(eslint@9.14.0(jiti@1.21.6))
+      enhanced-resolve: 5.17.1
+      eslint: 9.14.0(jiti@1.21.6)
+      eslint-plugin-es-x: 7.8.0(eslint@9.14.0(jiti@1.21.6))
+      get-tsconfig: 4.8.1
+      globals: 15.12.0
+      ignore: 5.3.2
+      minimatch: 9.0.5
+      semver: 7.6.3
+
+  eslint-plugin-no-only-tests@3.3.0: {}
+
+  eslint-plugin-perfectionist@3.9.1(eslint@9.14.0(jiti@1.21.6))(svelte@4.2.18)(typescript@5.6.3)(vue-eslint-parser@9.4.3(eslint@9.14.0(jiti@1.21.6))):
+    dependencies:
+      '@typescript-eslint/types': 8.14.0
+      '@typescript-eslint/utils': 8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)
+      eslint: 9.14.0(jiti@1.21.6)
+      minimatch: 9.0.5
+      natural-compare-lite: 1.4.0
+    optionalDependencies:
+      svelte: 4.2.18
+      vue-eslint-parser: 9.4.3(eslint@9.14.0(jiti@1.21.6))
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+
   eslint-plugin-react-hooks@4.6.2(eslint@8.55.0):
     dependencies:
       eslint: 8.55.0
 
+  eslint-plugin-react-hooks@4.6.2(eslint@9.14.0(jiti@1.21.6)):
+    dependencies:
+      eslint: 9.14.0(jiti@1.21.6)
+    optional: true
+
   eslint-plugin-react@7.34.2(eslint@8.55.0):
     dependencies:
       array-includes: 3.1.8
@@ -4673,13 +5885,97 @@ snapshots:
       semver: 6.3.1
       string.prototype.matchall: 4.0.11
 
+  eslint-plugin-regexp@2.6.0(eslint@9.14.0(jiti@1.21.6)):
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.0(eslint@9.14.0(jiti@1.21.6))
+      '@eslint-community/regexpp': 4.12.1
+      comment-parser: 1.4.1
+      eslint: 9.14.0(jiti@1.21.6)
+      jsdoc-type-pratt-parser: 4.1.0
+      refa: 0.12.1
+      regexp-ast-analysis: 0.7.1
+      scslre: 0.3.0
+
+  eslint-plugin-toml@0.11.1(eslint@9.14.0(jiti@1.21.6)):
+    dependencies:
+      debug: 4.3.7
+      eslint: 9.14.0(jiti@1.21.6)
+      eslint-compat-utils: 0.5.1(eslint@9.14.0(jiti@1.21.6))
+      lodash: 4.17.21
+      toml-eslint-parser: 0.10.0
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-plugin-unicorn@55.0.0(eslint@9.14.0(jiti@1.21.6)):
+    dependencies:
+      '@babel/helper-validator-identifier': 7.25.9
+      '@eslint-community/eslint-utils': 4.4.0(eslint@9.14.0(jiti@1.21.6))
+      ci-info: 4.0.0
+      clean-regexp: 1.0.0
+      core-js-compat: 3.39.0
+      eslint: 9.14.0(jiti@1.21.6)
+      esquery: 1.5.0
+      globals: 15.12.0
+      indent-string: 4.0.0
+      is-builtin-module: 3.2.1
+      jsesc: 3.0.2
+      pluralize: 8.0.0
+      read-pkg-up: 7.0.1
+      regexp-tree: 0.1.27
+      regjsparser: 0.10.0
+      semver: 7.6.3
+      strip-indent: 3.0.0
+
+  eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6)):
+    dependencies:
+      eslint: 9.14.0(jiti@1.21.6)
+    optionalDependencies:
+      '@typescript-eslint/eslint-plugin': 8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)
+
+  eslint-plugin-vue@9.31.0(eslint@9.14.0(jiti@1.21.6)):
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.0(eslint@9.14.0(jiti@1.21.6))
+      eslint: 9.14.0(jiti@1.21.6)
+      globals: 13.24.0
+      natural-compare: 1.4.0
+      nth-check: 2.1.1
+      postcss-selector-parser: 6.1.2
+      semver: 7.6.3
+      vue-eslint-parser: 9.4.3(eslint@9.14.0(jiti@1.21.6))
+      xml-name-validator: 4.0.0
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-plugin-yml@1.15.0(eslint@9.14.0(jiti@1.21.6)):
+    dependencies:
+      debug: 4.3.7
+      eslint: 9.14.0(jiti@1.21.6)
+      eslint-compat-utils: 0.5.1(eslint@9.14.0(jiti@1.21.6))
+      lodash: 4.17.21
+      natural-compare: 1.4.0
+      yaml-eslint-parser: 1.2.3
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.5.12)(eslint@9.14.0(jiti@1.21.6)):
+    dependencies:
+      '@vue/compiler-sfc': 3.5.12
+      eslint: 9.14.0(jiti@1.21.6)
+
   eslint-scope@7.2.2:
     dependencies:
       esrecurse: 4.3.0
       estraverse: 5.3.0
 
+  eslint-scope@8.2.0:
+    dependencies:
+      esrecurse: 4.3.0
+      estraverse: 5.3.0
+
   eslint-visitor-keys@3.4.3: {}
 
+  eslint-visitor-keys@4.2.0: {}
+
   eslint@8.55.0:
     dependencies:
       '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0)
@@ -4723,49 +6019,54 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  eslint@8.57.0:
+  eslint@9.14.0(jiti@1.21.6):
     dependencies:
-      '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
-      '@eslint-community/regexpp': 4.10.0
-      '@eslint/eslintrc': 2.1.4
-      '@eslint/js': 8.57.0
-      '@humanwhocodes/config-array': 0.11.14
+      '@eslint-community/eslint-utils': 4.4.0(eslint@9.14.0(jiti@1.21.6))
+      '@eslint-community/regexpp': 4.12.1
+      '@eslint/config-array': 0.18.0
+      '@eslint/core': 0.7.0
+      '@eslint/eslintrc': 3.1.0
+      '@eslint/js': 9.14.0
+      '@eslint/plugin-kit': 0.2.2
+      '@humanfs/node': 0.16.6
       '@humanwhocodes/module-importer': 1.0.1
-      '@nodelib/fs.walk': 1.2.8
-      '@ungap/structured-clone': 1.2.0
+      '@humanwhocodes/retry': 0.4.1
+      '@types/estree': 1.0.6
+      '@types/json-schema': 7.0.15
       ajv: 6.12.6
       chalk: 4.1.2
       cross-spawn: 7.0.3
-      debug: 4.3.4
-      doctrine: 3.0.0
+      debug: 4.3.6
       escape-string-regexp: 4.0.0
-      eslint-scope: 7.2.2
-      eslint-visitor-keys: 3.4.3
-      espree: 9.6.1
+      eslint-scope: 8.2.0
+      eslint-visitor-keys: 4.2.0
+      espree: 10.3.0
       esquery: 1.5.0
       esutils: 2.0.3
       fast-deep-equal: 3.1.3
-      file-entry-cache: 6.0.1
+      file-entry-cache: 8.0.0
       find-up: 5.0.0
       glob-parent: 6.0.2
-      globals: 13.24.0
-      graphemer: 1.4.0
       ignore: 5.3.1
       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.4
-      strip-ansi: 6.0.1
       text-table: 0.2.0
+    optionalDependencies:
+      jiti: 1.21.6
     transitivePeerDependencies:
       - supports-color
 
+  espree@10.3.0:
+    dependencies:
+      acorn: 8.14.0
+      acorn-jsx: 5.3.2(acorn@8.14.0)
+      eslint-visitor-keys: 4.2.0
+
   espree@9.6.1:
     dependencies:
       acorn: 8.11.3
@@ -4776,6 +6077,10 @@ snapshots:
     dependencies:
       estraverse: 5.3.0
 
+  esquery@1.6.0:
+    dependencies:
+      estraverse: 5.3.0
+
   esrecurse@4.3.0:
     dependencies:
       estraverse: 5.3.0
@@ -4790,32 +6095,12 @@ snapshots:
 
   esutils@2.0.3: {}
 
-  execa@5.1.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
-
-  execa@8.0.1:
-    dependencies:
-      cross-spawn: 7.0.3
-      get-stream: 8.0.1
-      human-signals: 5.0.0
-      is-stream: 3.0.0
-      merge-stream: 2.0.0
-      npm-run-path: 5.3.0
-      onetime: 6.0.0
-      signal-exit: 4.1.0
-      strip-final-newline: 3.0.0
+  expect-type@1.1.0: {}
 
   fast-deep-equal@3.1.3: {}
 
+  fast-diff@1.3.0: {}
+
   fast-glob@3.3.2:
     dependencies:
       '@nodelib/fs.stat': 2.0.5
@@ -4832,16 +6117,26 @@ snapshots:
     dependencies:
       reusify: 1.0.4
 
+  fdir@6.4.2(picomatch@4.0.2):
+    optionalDependencies:
+      picomatch: 4.0.2
+
   fflate@0.8.2: {}
 
   file-entry-cache@6.0.1:
     dependencies:
       flat-cache: 3.2.0
 
+  file-entry-cache@8.0.0:
+    dependencies:
+      flat-cache: 4.0.1
+
   fill-range@7.1.1:
     dependencies:
       to-regex-range: 5.0.1
 
+  find-up-simple@1.0.0: {}
+
   find-up@4.1.0:
     dependencies:
       locate-path: 5.0.0
@@ -4852,12 +6147,23 @@ snapshots:
       locate-path: 6.0.0
       path-exists: 4.0.0
 
+  find-up@7.0.0:
+    dependencies:
+      locate-path: 7.2.0
+      path-exists: 5.0.0
+      unicorn-magic: 0.1.0
+
   flat-cache@3.2.0:
     dependencies:
       flatted: 3.3.1
       keyv: 4.5.4
       rimraf: 3.0.2
 
+  flat-cache@4.0.1:
+    dependencies:
+      flatted: 3.3.1
+      keyv: 4.5.4
+
   flatted@3.3.1: {}
 
   for-each@0.3.3:
@@ -4903,10 +6209,6 @@ snapshots:
       has-symbols: 1.0.3
       hasown: 2.0.2
 
-  get-stream@6.0.1: {}
-
-  get-stream@8.0.1: {}
-
   get-symbol-description@1.0.2:
     dependencies:
       call-bind: 1.0.7
@@ -4917,13 +6219,15 @@ snapshots:
     dependencies:
       resolve-pkg-maps: 1.0.0
 
-  git-raw-commits@2.0.11:
+  get-tsconfig@4.8.1:
     dependencies:
-      dargs: 7.0.0
-      lodash: 4.17.21
-      meow: 8.1.2
-      split2: 3.2.2
-      through2: 4.0.2
+      resolve-pkg-maps: 1.0.0
+
+  git-raw-commits@4.0.0:
+    dependencies:
+      dargs: 8.1.0
+      meow: 12.1.1
+      split2: 4.2.0
 
   glob-parent@5.1.2:
     dependencies:
@@ -4962,14 +6266,18 @@ snapshots:
       once: 1.4.0
       path-is-absolute: 1.0.1
 
-  global-dirs@0.1.1:
+  global-directory@4.0.1:
     dependencies:
-      ini: 1.3.8
+      ini: 4.1.1
 
   globals@13.24.0:
     dependencies:
       type-fest: 0.20.2
 
+  globals@14.0.0: {}
+
+  globals@15.12.0: {}
+
   globalthis@1.0.4:
     dependencies:
       define-properties: 1.2.1
@@ -4992,8 +6300,6 @@ snapshots:
 
   graphemer@1.4.0: {}
 
-  hard-rejection@2.1.0: {}
-
   has-bigints@1.0.2: {}
 
   has-flag@3.0.0: {}
@@ -5020,20 +6326,12 @@ snapshots:
 
   hosted-git-info@2.8.9: {}
 
-  hosted-git-info@4.1.0:
-    dependencies:
-      lru-cache: 6.0.0
-
   html-escaper@2.0.2: {}
 
-  human-signals@2.1.0: {}
-
-  human-signals@5.0.0: {}
-
-  husky@9.1.5: {}
-
   ignore@5.3.1: {}
 
+  ignore@5.3.2: {}
+
   import-fresh@3.3.0:
     dependencies:
       parent-module: 1.0.1
@@ -5041,6 +6339,8 @@ snapshots:
 
   import-lazy@4.0.0: {}
 
+  import-meta-resolve@4.1.0: {}
+
   imurmurhash@0.1.4: {}
 
   indent-string@4.0.0: {}
@@ -5052,7 +6352,7 @@ snapshots:
 
   inherits@2.0.4: {}
 
-  ini@1.3.8: {}
+  ini@4.1.1: {}
 
   internal-slot@1.0.7:
     dependencies:
@@ -5080,6 +6380,10 @@ snapshots:
       call-bind: 1.0.7
       has-tostringtag: 1.0.2
 
+  is-builtin-module@3.2.1:
+    dependencies:
+      builtin-modules: 3.3.0
+
   is-callable@1.2.7: {}
 
   is-core-module@2.13.1:
@@ -5124,8 +6428,6 @@ snapshots:
 
   is-path-inside@3.0.3: {}
 
-  is-plain-obj@1.1.0: {}
-
   is-reference@3.0.2:
     dependencies:
       '@types/estree': 1.0.5
@@ -5141,10 +6443,6 @@ snapshots:
     dependencies:
       call-bind: 1.0.7
 
-  is-stream@2.0.1: {}
-
-  is-stream@3.0.0: {}
-
   is-string@1.0.7:
     dependencies:
       has-tostringtag: 1.0.2
@@ -5194,7 +6492,7 @@ snapshots:
   istanbul-lib-source-maps@5.0.6:
     dependencies:
       '@jridgewell/trace-mapping': 0.3.25
-      debug: 4.3.6
+      debug: 4.3.7
       istanbul-lib-coverage: 3.2.2
     transitivePeerDependencies:
       - supports-color
@@ -5218,7 +6516,7 @@ snapshots:
     optionalDependencies:
       '@pkgjs/parseargs': 0.11.0
 
-  jiti@1.21.0: {}
+  jiti@1.21.6: {}
 
   jju@1.4.0: {}
 
@@ -5228,6 +6526,12 @@ snapshots:
     dependencies:
       argparse: 2.0.1
 
+  jsdoc-type-pratt-parser@4.1.0: {}
+
+  jsesc@0.5.0: {}
+
+  jsesc@3.0.2: {}
+
   json-buffer@3.0.1: {}
 
   json-parse-even-better-errors@2.3.1: {}
@@ -5242,6 +6546,13 @@ snapshots:
     dependencies:
       minimist: 1.2.8
 
+  jsonc-eslint-parser@2.4.0:
+    dependencies:
+      acorn: 8.14.0
+      eslint-visitor-keys: 3.4.3
+      espree: 9.6.1
+      semver: 7.6.3
+
   jsonfile@4.0.0:
     optionalDependencies:
       graceful-fs: 4.2.11
@@ -5259,8 +6570,6 @@ snapshots:
     dependencies:
       json-buffer: 3.0.1
 
-  kind-of@6.0.3: {}
-
   kleur@4.1.5: {}
 
   kolorist@1.8.0: {}
@@ -5293,9 +6602,11 @@ snapshots:
     dependencies:
       p-locate: 5.0.0
 
-  lodash.camelcase@4.3.0: {}
+  locate-path@7.2.0:
+    dependencies:
+      p-locate: 6.0.0
 
-  lodash.isfunction@3.0.9: {}
+  lodash.camelcase@4.3.0: {}
 
   lodash.isplainobject@4.0.6: {}
 
@@ -5315,6 +6626,8 @@ snapshots:
 
   lodash@4.17.21: {}
 
+  longest-streak@3.1.0: {}
+
   loose-envify@1.4.0:
     dependencies:
       js-tokens: 4.0.0
@@ -5323,6 +6636,8 @@ snapshots:
     dependencies:
       get-func-name: 2.0.2
 
+  loupe@3.1.2: {}
+
   lru-cache@10.4.3: {}
 
   lru-cache@6.0.0:
@@ -5337,51 +6652,326 @@ snapshots:
     dependencies:
       '@jridgewell/sourcemap-codec': 1.5.0
 
-  magicast@0.3.4:
+  magic-string@0.30.12:
     dependencies:
-      '@babel/parser': 7.25.3
-      '@babel/types': 7.25.2
+      '@jridgewell/sourcemap-codec': 1.5.0
+
+  magicast@0.3.5:
+    dependencies:
+      '@babel/parser': 7.26.2
+      '@babel/types': 7.26.0
       source-map-js: 1.2.0
 
   make-dir@4.0.0:
     dependencies:
       semver: 7.6.3
 
-  map-obj@1.0.1: {}
+  markdown-table@3.0.4: {}
+
+  mdast-util-find-and-replace@3.0.1:
+    dependencies:
+      '@types/mdast': 4.0.4
+      escape-string-regexp: 5.0.0
+      unist-util-is: 6.0.0
+      unist-util-visit-parents: 6.0.1
+
+  mdast-util-from-markdown@2.0.2:
+    dependencies:
+      '@types/mdast': 4.0.4
+      '@types/unist': 3.0.3
+      decode-named-character-reference: 1.0.2
+      devlop: 1.1.0
+      mdast-util-to-string: 4.0.0
+      micromark: 4.0.0
+      micromark-util-decode-numeric-character-reference: 2.0.1
+      micromark-util-decode-string: 2.0.0
+      micromark-util-normalize-identifier: 2.0.0
+      micromark-util-symbol: 2.0.0
+      micromark-util-types: 2.0.0
+      unist-util-stringify-position: 4.0.0
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-gfm-autolink-literal@2.0.1:
+    dependencies:
+      '@types/mdast': 4.0.4
+      ccount: 2.0.1
+      devlop: 1.1.0
+      mdast-util-find-and-replace: 3.0.1
+      micromark-util-character: 2.1.0
+
+  mdast-util-gfm-footnote@2.0.0:
+    dependencies:
+      '@types/mdast': 4.0.4
+      devlop: 1.1.0
+      mdast-util-from-markdown: 2.0.2
+      mdast-util-to-markdown: 2.1.2
+      micromark-util-normalize-identifier: 2.0.0
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-gfm-strikethrough@2.0.0:
+    dependencies:
+      '@types/mdast': 4.0.4
+      mdast-util-from-markdown: 2.0.2
+      mdast-util-to-markdown: 2.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-gfm-table@2.0.0:
+    dependencies:
+      '@types/mdast': 4.0.4
+      devlop: 1.1.0
+      markdown-table: 3.0.4
+      mdast-util-from-markdown: 2.0.2
+      mdast-util-to-markdown: 2.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-gfm-task-list-item@2.0.0:
+    dependencies:
+      '@types/mdast': 4.0.4
+      devlop: 1.1.0
+      mdast-util-from-markdown: 2.0.2
+      mdast-util-to-markdown: 2.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-gfm@3.0.0:
+    dependencies:
+      mdast-util-from-markdown: 2.0.2
+      mdast-util-gfm-autolink-literal: 2.0.1
+      mdast-util-gfm-footnote: 2.0.0
+      mdast-util-gfm-strikethrough: 2.0.0
+      mdast-util-gfm-table: 2.0.0
+      mdast-util-gfm-task-list-item: 2.0.0
+      mdast-util-to-markdown: 2.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-phrasing@4.1.0:
+    dependencies:
+      '@types/mdast': 4.0.4
+      unist-util-is: 6.0.0
+
+  mdast-util-to-markdown@2.1.2:
+    dependencies:
+      '@types/mdast': 4.0.4
+      '@types/unist': 3.0.3
+      longest-streak: 3.1.0
+      mdast-util-phrasing: 4.1.0
+      mdast-util-to-string: 4.0.0
+      micromark-util-classify-character: 2.0.0
+      micromark-util-decode-string: 2.0.0
+      unist-util-visit: 5.0.0
+      zwitch: 2.0.4
 
-  map-obj@4.3.0: {}
+  mdast-util-to-string@4.0.0:
+    dependencies:
+      '@types/mdast': 4.0.4
 
   mdn-data@2.0.30: {}
 
   meow@12.1.1: {}
 
-  meow@8.1.2:
+  merge2@1.4.1: {}
+
+  micromark-core-commonmark@2.0.1:
     dependencies:
-      '@types/minimist': 1.2.5
-      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
+      decode-named-character-reference: 1.0.2
+      devlop: 1.1.0
+      micromark-factory-destination: 2.0.0
+      micromark-factory-label: 2.0.0
+      micromark-factory-space: 2.0.0
+      micromark-factory-title: 2.0.0
+      micromark-factory-whitespace: 2.0.0
+      micromark-util-character: 2.1.0
+      micromark-util-chunked: 2.0.0
+      micromark-util-classify-character: 2.0.0
+      micromark-util-html-tag-name: 2.0.0
+      micromark-util-normalize-identifier: 2.0.0
+      micromark-util-resolve-all: 2.0.0
+      micromark-util-subtokenize: 2.0.1
+      micromark-util-symbol: 2.0.0
+      micromark-util-types: 2.0.0
 
-  merge-stream@2.0.0: {}
+  micromark-extension-gfm-autolink-literal@2.1.0:
+    dependencies:
+      micromark-util-character: 2.1.0
+      micromark-util-sanitize-uri: 2.0.0
+      micromark-util-symbol: 2.0.0
+      micromark-util-types: 2.0.0
 
-  merge2@1.4.1: {}
+  micromark-extension-gfm-footnote@2.1.0:
+    dependencies:
+      devlop: 1.1.0
+      micromark-core-commonmark: 2.0.1
+      micromark-factory-space: 2.0.0
+      micromark-util-character: 2.1.0
+      micromark-util-normalize-identifier: 2.0.0
+      micromark-util-sanitize-uri: 2.0.0
+      micromark-util-symbol: 2.0.0
+      micromark-util-types: 2.0.0
+
+  micromark-extension-gfm-strikethrough@2.1.0:
+    dependencies:
+      devlop: 1.1.0
+      micromark-util-chunked: 2.0.0
+      micromark-util-classify-character: 2.0.0
+      micromark-util-resolve-all: 2.0.0
+      micromark-util-symbol: 2.0.0
+      micromark-util-types: 2.0.0
+
+  micromark-extension-gfm-table@2.1.0:
+    dependencies:
+      devlop: 1.1.0
+      micromark-factory-space: 2.0.0
+      micromark-util-character: 2.1.0
+      micromark-util-symbol: 2.0.0
+      micromark-util-types: 2.0.0
+
+  micromark-extension-gfm-tagfilter@2.0.0:
+    dependencies:
+      micromark-util-types: 2.0.0
+
+  micromark-extension-gfm-task-list-item@2.1.0:
+    dependencies:
+      devlop: 1.1.0
+      micromark-factory-space: 2.0.0
+      micromark-util-character: 2.1.0
+      micromark-util-symbol: 2.0.0
+      micromark-util-types: 2.0.0
+
+  micromark-extension-gfm@3.0.0:
+    dependencies:
+      micromark-extension-gfm-autolink-literal: 2.1.0
+      micromark-extension-gfm-footnote: 2.1.0
+      micromark-extension-gfm-strikethrough: 2.1.0
+      micromark-extension-gfm-table: 2.1.0
+      micromark-extension-gfm-tagfilter: 2.0.0
+      micromark-extension-gfm-task-list-item: 2.1.0
+      micromark-util-combine-extensions: 2.0.0
+      micromark-util-types: 2.0.0
+
+  micromark-factory-destination@2.0.0:
+    dependencies:
+      micromark-util-character: 2.1.0
+      micromark-util-symbol: 2.0.0
+      micromark-util-types: 2.0.0
+
+  micromark-factory-label@2.0.0:
+    dependencies:
+      devlop: 1.1.0
+      micromark-util-character: 2.1.0
+      micromark-util-symbol: 2.0.0
+      micromark-util-types: 2.0.0
+
+  micromark-factory-space@2.0.0:
+    dependencies:
+      micromark-util-character: 2.1.0
+      micromark-util-types: 2.0.0
+
+  micromark-factory-title@2.0.0:
+    dependencies:
+      micromark-factory-space: 2.0.0
+      micromark-util-character: 2.1.0
+      micromark-util-symbol: 2.0.0
+      micromark-util-types: 2.0.0
+
+  micromark-factory-whitespace@2.0.0:
+    dependencies:
+      micromark-factory-space: 2.0.0
+      micromark-util-character: 2.1.0
+      micromark-util-symbol: 2.0.0
+      micromark-util-types: 2.0.0
+
+  micromark-util-character@2.1.0:
+    dependencies:
+      micromark-util-symbol: 2.0.0
+      micromark-util-types: 2.0.0
+
+  micromark-util-chunked@2.0.0:
+    dependencies:
+      micromark-util-symbol: 2.0.0
+
+  micromark-util-classify-character@2.0.0:
+    dependencies:
+      micromark-util-character: 2.1.0
+      micromark-util-symbol: 2.0.0
+      micromark-util-types: 2.0.0
+
+  micromark-util-combine-extensions@2.0.0:
+    dependencies:
+      micromark-util-chunked: 2.0.0
+      micromark-util-types: 2.0.0
+
+  micromark-util-decode-numeric-character-reference@2.0.1:
+    dependencies:
+      micromark-util-symbol: 2.0.0
+
+  micromark-util-decode-string@2.0.0:
+    dependencies:
+      decode-named-character-reference: 1.0.2
+      micromark-util-character: 2.1.0
+      micromark-util-decode-numeric-character-reference: 2.0.1
+      micromark-util-symbol: 2.0.0
+
+  micromark-util-encode@2.0.0: {}
+
+  micromark-util-html-tag-name@2.0.0: {}
+
+  micromark-util-normalize-identifier@2.0.0:
+    dependencies:
+      micromark-util-symbol: 2.0.0
+
+  micromark-util-resolve-all@2.0.0:
+    dependencies:
+      micromark-util-types: 2.0.0
+
+  micromark-util-sanitize-uri@2.0.0:
+    dependencies:
+      micromark-util-character: 2.1.0
+      micromark-util-encode: 2.0.0
+      micromark-util-symbol: 2.0.0
+
+  micromark-util-subtokenize@2.0.1:
+    dependencies:
+      devlop: 1.1.0
+      micromark-util-chunked: 2.0.0
+      micromark-util-symbol: 2.0.0
+      micromark-util-types: 2.0.0
+
+  micromark-util-symbol@2.0.0: {}
+
+  micromark-util-types@2.0.0: {}
+
+  micromark@4.0.0:
+    dependencies:
+      '@types/debug': 4.1.12
+      debug: 4.3.7
+      decode-named-character-reference: 1.0.2
+      devlop: 1.1.0
+      micromark-core-commonmark: 2.0.1
+      micromark-factory-space: 2.0.0
+      micromark-util-character: 2.1.0
+      micromark-util-chunked: 2.0.0
+      micromark-util-combine-extensions: 2.0.0
+      micromark-util-decode-numeric-character-reference: 2.0.1
+      micromark-util-encode: 2.0.0
+      micromark-util-normalize-identifier: 2.0.0
+      micromark-util-resolve-all: 2.0.0
+      micromark-util-sanitize-uri: 2.0.0
+      micromark-util-subtokenize: 2.0.1
+      micromark-util-symbol: 2.0.0
+      micromark-util-types: 2.0.0
+    transitivePeerDependencies:
+      - supports-color
 
   micromatch@4.0.7:
     dependencies:
       braces: 3.0.3
       picomatch: 2.3.1
 
-  mimic-fn@2.1.0: {}
-
-  mimic-fn@4.0.0: {}
-
   min-indent@1.0.1: {}
 
   minimatch@3.0.8:
@@ -5400,12 +6990,6 @@ snapshots:
     dependencies:
       brace-expansion: 2.0.1
 
-  minimist-options@4.1.0:
-    dependencies:
-      arrify: 1.0.1
-      is-plain-obj: 1.1.0
-      kind-of: 6.0.3
-
   minimist@1.2.8: {}
 
   minipass@7.1.2: {}
@@ -5421,10 +7005,14 @@ snapshots:
 
   ms@2.1.2: {}
 
+  ms@2.1.3: {}
+
   muggle-string@0.4.1: {}
 
   nanoid@3.3.7: {}
 
+  natural-compare-lite@1.4.0: {}
+
   natural-compare@1.4.0: {}
 
   next@13.5.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
@@ -5456,6 +7044,8 @@ snapshots:
     dependencies:
       whatwg-url: 5.0.0
 
+  node-releases@2.0.18: {}
+
   normalize-package-data@2.5.0:
     dependencies:
       hosted-git-info: 2.8.9
@@ -5463,20 +7053,9 @@ snapshots:
       semver: 5.7.2
       validate-npm-package-license: 3.0.4
 
-  normalize-package-data@3.0.3:
-    dependencies:
-      hosted-git-info: 4.1.0
-      is-core-module: 2.13.1
-      semver: 7.6.2
-      validate-npm-package-license: 3.0.4
-
-  npm-run-path@4.0.1:
-    dependencies:
-      path-key: 3.1.1
-
-  npm-run-path@5.3.0:
+  nth-check@2.1.1:
     dependencies:
-      path-key: 4.0.0
+      boolbase: 1.0.0
 
   object-assign@4.1.1: {}
 
@@ -5526,14 +7105,6 @@ snapshots:
     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
-
   optionator@0.9.4:
     dependencies:
       deep-is: 0.1.4
@@ -5551,6 +7122,10 @@ snapshots:
     dependencies:
       yocto-queue: 0.1.0
 
+  p-limit@4.0.0:
+    dependencies:
+      yocto-queue: 1.1.1
+
   p-locate@4.1.0:
     dependencies:
       p-limit: 2.3.0
@@ -5559,14 +7134,27 @@ snapshots:
     dependencies:
       p-limit: 3.1.0
 
+  p-locate@6.0.0:
+    dependencies:
+      p-limit: 4.0.0
+
   p-try@2.2.0: {}
 
   package-json-from-dist@1.0.0: {}
 
+  package-manager-detector@0.2.2: {}
+
   parent-module@1.0.1:
     dependencies:
       callsites: 3.1.0
 
+  parse-gitignore@2.0.0: {}
+
+  parse-imports@2.2.1:
+    dependencies:
+      es-module-lexer: 1.5.4
+      slashes: 3.0.12
+
   parse-json@5.2.0:
     dependencies:
       '@babel/code-frame': 7.24.6
@@ -5578,12 +7166,12 @@ snapshots:
 
   path-exists@4.0.0: {}
 
+  path-exists@5.0.0: {}
+
   path-is-absolute@1.0.1: {}
 
   path-key@3.1.1: {}
 
-  path-key@4.0.0: {}
-
   path-parse@1.0.7: {}
 
   path-scurry@1.11.1:
@@ -5605,8 +7193,12 @@ snapshots:
 
   picocolors@1.0.1: {}
 
+  picocolors@1.1.1: {}
+
   picomatch@2.3.1: {}
 
+  picomatch@4.0.2: {}
+
   pkg-types@1.1.3:
     dependencies:
       confbox: 0.1.7
@@ -5615,8 +7207,15 @@ snapshots:
 
   playground@file:playground: {}
 
+  pluralize@8.0.0: {}
+
   possible-typed-array-names@1.0.0: {}
 
+  postcss-selector-parser@6.1.2:
+    dependencies:
+      cssesc: 3.0.0
+      util-deprecate: 1.0.2
+
   postcss@8.4.31:
     dependencies:
       nanoid: 3.3.7
@@ -5635,8 +7234,18 @@ snapshots:
       picocolors: 1.0.1
       source-map-js: 1.2.0
 
+  postcss@8.4.49:
+    dependencies:
+      nanoid: 3.3.7
+      picocolors: 1.1.1
+      source-map-js: 1.2.1
+
   prelude-ls@1.2.1: {}
 
+  prettier-linter-helpers@1.0.0:
+    dependencies:
+      fast-diff: 1.3.0
+
   prettier@3.3.3: {}
 
   prop-types@15.8.1:
@@ -5651,8 +7260,6 @@ snapshots:
 
   queue-microtask@1.2.3: {}
 
-  quick-lru@4.0.1: {}
-
   react-dom@18.3.1(react@18.3.1):
     dependencies:
       loose-envify: 1.4.0
@@ -5678,16 +7285,9 @@ snapshots:
       parse-json: 5.2.0
       type-fest: 0.6.0
 
-  readable-stream@3.6.2:
+  refa@0.12.1:
     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
+      '@eslint-community/regexpp': 4.12.1
 
   reflect.getprototypeof@1.0.6:
     dependencies:
@@ -5701,6 +7301,13 @@ snapshots:
 
   regenerator-runtime@0.14.1: {}
 
+  regexp-ast-analysis@0.7.1:
+    dependencies:
+      '@eslint-community/regexpp': 4.12.1
+      refa: 0.12.1
+
+  regexp-tree@0.1.27: {}
+
   regexp.prototype.flags@1.5.2:
     dependencies:
       call-bind: 1.0.7
@@ -5708,6 +7315,10 @@ snapshots:
       es-errors: 1.3.0
       set-function-name: 2.0.2
 
+  regjsparser@0.10.0:
+    dependencies:
+      jsesc: 0.5.0
+
   require-directory@2.1.1: {}
 
   require-from-string@2.0.2: {}
@@ -5716,10 +7327,6 @@ snapshots:
 
   resolve-from@5.0.0: {}
 
-  resolve-global@1.0.0:
-    dependencies:
-      global-dirs: 0.1.1
-
   resolve-pkg-maps@1.0.0: {}
 
   resolve@1.22.8:
@@ -5795,8 +7402,6 @@ snapshots:
       has-symbols: 1.0.3
       isarray: 2.0.5
 
-  safe-buffer@5.2.1: {}
-
   safe-regex-test@1.0.3:
     dependencies:
       call-bind: 1.0.7
@@ -5807,6 +7412,12 @@ snapshots:
     dependencies:
       loose-envify: 1.4.0
 
+  scslre@0.3.0:
+    dependencies:
+      '@eslint-community/regexpp': 4.12.1
+      refa: 0.12.1
+      regexp-ast-analysis: 0.7.1
+
   semver@5.7.2: {}
 
   semver@6.3.1: {}
@@ -5815,10 +7426,6 @@ snapshots:
     dependencies:
       lru-cache: 6.0.0
 
-  semver@7.6.0:
-    dependencies:
-      lru-cache: 6.0.0
-
   semver@7.6.2: {}
 
   semver@7.6.3: {}
@@ -5854,44 +7461,51 @@ snapshots:
 
   siginfo@2.0.0: {}
 
-  signal-exit@3.0.7: {}
-
   signal-exit@4.1.0: {}
 
-  sirv@2.0.4:
+  sirv@3.0.0:
     dependencies:
       '@polka/url': 1.0.0-next.25
       mrmime: 2.0.0
       totalist: 3.0.1
 
+  sisteransi@1.0.5: {}
+
   slash@3.0.0: {}
 
+  slashes@3.0.12: {}
+
   source-map-js@1.2.0: {}
 
+  source-map-js@1.2.1: {}
+
   source-map@0.6.1: {}
 
   spdx-correct@3.2.0:
     dependencies:
       spdx-expression-parse: 3.0.1
-      spdx-license-ids: 3.0.18
+      spdx-license-ids: 3.0.20
 
   spdx-exceptions@2.5.0: {}
 
   spdx-expression-parse@3.0.1:
     dependencies:
       spdx-exceptions: 2.5.0
-      spdx-license-ids: 3.0.18
-
-  spdx-license-ids@3.0.18: {}
+      spdx-license-ids: 3.0.20
 
-  split2@3.2.2:
+  spdx-expression-parse@4.0.0:
     dependencies:
-      readable-stream: 3.6.2
+      spdx-exceptions: 2.5.0
+      spdx-license-ids: 3.0.20
+
+  spdx-license-ids@3.0.20: {}
 
   split2@4.2.0: {}
 
   sprintf-js@1.0.3: {}
 
+  stable-hash@0.0.4: {}
+
   stackback@0.0.2: {}
 
   std-env@3.7.0: {}
@@ -5946,10 +7560,6 @@ snapshots:
       define-properties: 1.2.1
       es-object-atoms: 1.0.0
 
-  string_decoder@1.3.0:
-    dependencies:
-      safe-buffer: 5.2.1
-
   strip-ansi@6.0.1:
     dependencies:
       ansi-regex: 5.0.1
@@ -5960,10 +7570,6 @@ snapshots:
 
   strip-bom@3.0.0: {}
 
-  strip-final-newline@2.0.0: {}
-
-  strip-final-newline@3.0.0: {}
-
   strip-indent@3.0.0:
     dependencies:
       min-indent: 1.0.1
@@ -6016,6 +7622,15 @@ snapshots:
       react: 18.3.1
       use-sync-external-store: 1.2.2(react@18.3.1)
 
+  synckit@0.6.2:
+    dependencies:
+      tslib: 2.6.3
+
+  synckit@0.9.2:
+    dependencies:
+      '@pkgr/core': 0.1.1
+      tslib: 2.6.3
+
   tapable@2.2.1: {}
 
   test-exclude@7.0.1:
@@ -6028,19 +7643,22 @@ snapshots:
 
   text-table@0.2.0: {}
 
-  through2@4.0.2:
-    dependencies:
-      readable-stream: 3.6.2
-
   through@2.3.8: {}
 
   tinybench@2.9.0: {}
 
+  tinyexec@0.3.1: {}
+
+  tinyglobby@0.2.10:
+    dependencies:
+      fdir: 6.4.2(picomatch@4.0.2)
+      picomatch: 4.0.2
+
   tinypool@1.0.1: {}
 
   tinyrainbow@1.2.0: {}
 
-  tinyspy@3.0.0: {}
+  tinyspy@3.0.2: {}
 
   to-fast-properties@2.0.0: {}
 
@@ -6048,15 +7666,17 @@ snapshots:
     dependencies:
       is-number: 7.0.0
 
+  toml-eslint-parser@0.10.0:
+    dependencies:
+      eslint-visitor-keys: 3.4.3
+
   totalist@3.0.1: {}
 
   tr46@0.0.3: {}
 
-  trim-newlines@3.0.1: {}
-
-  ts-api-utils@1.3.0(typescript@5.5.4):
+  ts-api-utils@1.3.0(typescript@5.6.3):
     dependencies:
-      typescript: 5.5.4
+      typescript: 5.6.3
 
   tsconfig-paths@3.15.0:
     dependencies:
@@ -6071,8 +7691,6 @@ snapshots:
     dependencies:
       prelude-ls: 1.2.1
 
-  type-fest@0.18.1: {}
-
   type-fest@0.20.2: {}
 
   type-fest@0.6.0: {}
@@ -6115,7 +7733,7 @@ snapshots:
 
   typescript@5.4.5: {}
 
-  typescript@5.5.4: {}
+  typescript@5.6.3: {}
 
   ufo@1.5.4: {}
 
@@ -6128,8 +7746,35 @@ snapshots:
 
   undici-types@6.19.8: {}
 
+  unicorn-magic@0.1.0: {}
+
+  unist-util-is@6.0.0:
+    dependencies:
+      '@types/unist': 3.0.3
+
+  unist-util-stringify-position@4.0.0:
+    dependencies:
+      '@types/unist': 3.0.3
+
+  unist-util-visit-parents@6.0.1:
+    dependencies:
+      '@types/unist': 3.0.3
+      unist-util-is: 6.0.0
+
+  unist-util-visit@5.0.0:
+    dependencies:
+      '@types/unist': 3.0.3
+      unist-util-is: 6.0.0
+      unist-util-visit-parents: 6.0.1
+
   universalify@0.1.2: {}
 
+  update-browserslist-db@1.1.1(browserslist@4.24.2):
+    dependencies:
+      browserslist: 4.24.2
+      escalade: 3.2.0
+      picocolors: 1.1.1
+
   uri-js@4.4.1:
     dependencies:
       punycode: 2.3.1
@@ -6145,13 +7790,12 @@ snapshots:
       spdx-correct: 3.2.0
       spdx-expression-parse: 3.0.1
 
-  vite-node@2.0.5(@types/node@22.4.2):
+  vite-node@2.1.4(@types/node@22.4.2):
     dependencies:
       cac: 6.7.14
-      debug: 4.3.6
+      debug: 4.3.7
       pathe: 1.1.2
-      tinyrainbow: 1.2.0
-      vite: 5.4.2(@types/node@22.4.2)
+      vite: 5.4.11(@types/node@22.4.2)
     transitivePeerDependencies:
       - '@types/node'
       - less
@@ -6163,23 +7807,22 @@ snapshots:
       - supports-color
       - terser
 
-  vite-plugin-banner@0.7.1: {}
+  vite-plugin-banner@0.8.0: {}
 
-  vite-plugin-dts@4.0.3(@types/node@22.4.2)(rollup@4.21.0)(typescript@5.5.4)(vite@5.4.2(@types/node@22.4.2)):
+  vite-plugin-dts@4.3.0(@types/node@22.4.2)(rollup@4.21.0)(typescript@5.6.3)(vite@5.4.11(@types/node@22.4.2)):
     dependencies:
-      '@microsoft/api-extractor': 7.47.4(@types/node@22.4.2)
+      '@microsoft/api-extractor': 7.47.11(@types/node@22.4.2)
       '@rollup/pluginutils': 5.1.0(rollup@4.21.0)
-      '@volar/typescript': 2.4.0
-      '@vue/language-core': 2.0.29(typescript@5.5.4)
+      '@volar/typescript': 2.4.10
+      '@vue/language-core': 2.1.6(typescript@5.6.3)
       compare-versions: 6.1.1
       debug: 4.3.6
       kolorist: 1.8.0
       local-pkg: 0.5.0
       magic-string: 0.30.11
-      typescript: 5.5.4
-      vue-tsc: 2.0.29(typescript@5.5.4)
+      typescript: 5.6.3
     optionalDependencies:
-      vite: 5.4.2(@types/node@22.4.2)
+      vite: 5.4.11(@types/node@22.4.2)
     transitivePeerDependencies:
       - '@types/node'
       - rollup
@@ -6199,6 +7842,15 @@ snapshots:
       '@types/node': 22.4.2
       fsevents: 2.3.3
 
+  vite@5.4.11(@types/node@22.4.2):
+    dependencies:
+      esbuild: 0.21.5
+      postcss: 8.4.49
+      rollup: 4.21.0
+    optionalDependencies:
+      '@types/node': 22.4.2
+      fsevents: 2.3.3
+
   vite@5.4.2(@types/node@22.4.2):
     dependencies:
       esbuild: 0.21.5
@@ -6212,33 +7864,35 @@ snapshots:
     optionalDependencies:
       vite: 5.4.2(@types/node@22.4.2)
 
-  vitest@2.0.5(@types/node@22.4.2)(@vitest/ui@2.0.5):
-    dependencies:
-      '@ampproject/remapping': 2.3.0
-      '@vitest/expect': 2.0.5
-      '@vitest/pretty-format': 2.0.5
-      '@vitest/runner': 2.0.5
-      '@vitest/snapshot': 2.0.5
-      '@vitest/spy': 2.0.5
-      '@vitest/utils': 2.0.5
-      chai: 5.1.1
-      debug: 4.3.6
-      execa: 8.0.1
-      magic-string: 0.30.11
+  vitest@2.1.4(@types/node@22.4.2)(@vitest/ui@2.1.4):
+    dependencies:
+      '@vitest/expect': 2.1.4
+      '@vitest/mocker': 2.1.4(vite@5.4.11(@types/node@22.4.2))
+      '@vitest/pretty-format': 2.1.4
+      '@vitest/runner': 2.1.4
+      '@vitest/snapshot': 2.1.4
+      '@vitest/spy': 2.1.4
+      '@vitest/utils': 2.1.4
+      chai: 5.1.2
+      debug: 4.3.7
+      expect-type: 1.1.0
+      magic-string: 0.30.12
       pathe: 1.1.2
       std-env: 3.7.0
       tinybench: 2.9.0
+      tinyexec: 0.3.1
       tinypool: 1.0.1
       tinyrainbow: 1.2.0
-      vite: 5.4.2(@types/node@22.4.2)
-      vite-node: 2.0.5(@types/node@22.4.2)
+      vite: 5.4.11(@types/node@22.4.2)
+      vite-node: 2.1.4(@types/node@22.4.2)
       why-is-node-running: 2.3.0
     optionalDependencies:
       '@types/node': 22.4.2
-      '@vitest/ui': 2.0.5(vitest@2.0.5)
+      '@vitest/ui': 2.1.4(vitest@2.1.4)
     transitivePeerDependencies:
       - less
       - lightningcss
+      - msw
       - sass
       - sass-embedded
       - stylus
@@ -6248,12 +7902,18 @@ snapshots:
 
   vscode-uri@3.0.8: {}
 
-  vue-tsc@2.0.29(typescript@5.5.4):
+  vue-eslint-parser@9.4.3(eslint@9.14.0(jiti@1.21.6)):
     dependencies:
-      '@volar/typescript': 2.4.0
-      '@vue/language-core': 2.0.29(typescript@5.5.4)
+      debug: 4.3.7
+      eslint: 9.14.0(jiti@1.21.6)
+      eslint-scope: 7.2.2
+      eslint-visitor-keys: 3.4.3
+      espree: 9.6.1
+      esquery: 1.5.0
+      lodash: 4.17.21
       semver: 7.6.3
-      typescript: 5.5.4
+    transitivePeerDependencies:
+      - supports-color
 
   watchpack@2.4.0:
     dependencies:
@@ -6332,11 +7992,19 @@ snapshots:
 
   wrappy@1.0.2: {}
 
+  xml-name-validator@4.0.0: {}
+
   y18n@5.0.8: {}
 
   yallist@4.0.0: {}
 
-  yargs-parser@20.2.9: {}
+  yaml-eslint-parser@1.2.3:
+    dependencies:
+      eslint-visitor-keys: 3.4.3
+      lodash: 4.17.21
+      yaml: 2.6.0
+
+  yaml@2.6.0: {}
 
   yargs-parser@21.1.1: {}
 
@@ -6351,3 +8019,7 @@ snapshots:
       yargs-parser: 21.1.1
 
   yocto-queue@0.1.0: {}
+
+  yocto-queue@1.1.1: {}
+
+  zwitch@2.0.4: {}
diff --git a/src/constants.ts b/src/constants.ts
index 162c7119..744b1bd2 100644
--- a/src/constants.ts
+++ b/src/constants.ts
@@ -1,19 +1,19 @@
-const METHOD = {
+const _METHOD = {
   GET: 'get',
   DELETE: 'delete',
   POST: 'post',
   PUT: 'put',
-} as const
+} as const;
 
-type ObjectValues = T[keyof T]
-type Method = ObjectValues
+type ObjectValues = T[keyof T];
+type Method = ObjectValues;
 
-export default Method
+export default Method;
 
-export const STORYBLOK_AGENT = 'SB-Agent'
+export const STORYBLOK_AGENT = 'SB-Agent';
 
 export const STORYBLOK_JS_CLIENT_AGENT = {
   defaultAgentName: 'SB-JS-CLIENT',
   defaultAgentVersion: 'SB-Agent-Version',
   packageVersion: '6.0.0',
-}
+};
diff --git a/src/entry.esm.ts b/src/entry.esm.ts
index 1699494d..ddff9842 100644
--- a/src/entry.esm.ts
+++ b/src/entry.esm.ts
@@ -1,10 +1,10 @@
-import Client from './index'
+import Client from './index';
 
 // All default and named exports, including types for ESM bundle
-export default Client
-export * from './constants'
-export * from './interfaces'
-export { default as RichtextResolver } from './richTextResolver'
-export { default as RichtextSchema } from './schema'
-export { default as SbFetch } from './sbFetch'
-export * from './sbHelpers'
+export default Client;
+export * from './constants';
+export * from './interfaces';
+export { default as RichtextResolver } from './richTextResolver';
+export { default as SbFetch } from './sbFetch';
+export * from './sbHelpers';
+export { default as RichtextSchema } from './schema';
diff --git a/src/entry.umd.ts b/src/entry.umd.ts
index 796210b7..08ed9a6f 100644
--- a/src/entry.umd.ts
+++ b/src/entry.umd.ts
@@ -1,15 +1,17 @@
-import Client from './index'
-import RichtextResolver from './richTextResolver'
-import SbFetch from './sbFetch'
-import RichTextSchema from './schema'
-import * as sbHelpers from './sbHelpers'
+import Client from './index';
+import RichtextResolver from './richTextResolver';
+import SbFetch from './sbFetch';
+import RichTextSchema from './schema';
+import * as sbHelpers from './sbHelpers';
 
 const extend = (to: Record, _from: Record) => {
-  for (const key in _from) to[key] = _from[key]
-}
+  for (const key in _from) {
+    to[key] = _from[key];
+  }
+};
 
-extend(Client, { RichtextResolver, SbFetch, RichTextSchema })
-extend(Client, sbHelpers)
+extend(Client, { RichtextResolver, SbFetch, RichTextSchema });
+extend(Client, sbHelpers);
 
 // Single default export object for UMD friendly bundle
-export default Client
+export default Client;
diff --git a/src/index.test.ts b/src/index.test.ts
index 46775571..e9dbd38e 100644
--- a/src/index.test.ts
+++ b/src/index.test.ts
@@ -1,7 +1,8 @@
-import StoryblokClient from '.'
-import { describe, it, expect, beforeEach, vi } from 'vitest'
-import SbFetch, { ResponseFn } from './sbFetch'
-import { SbHelpers } from './sbHelpers'
+import StoryblokClient from '.';
+import { beforeEach, describe, expect, it, vi } from 'vitest';
+import type { ResponseFn } from './sbFetch';
+import SbFetch from './sbFetch';
+import { SbHelpers } from './sbHelpers';
 
 // Mocking external dependencies
 vi.mock('../src/sbFetch', () => {
@@ -11,205 +12,204 @@ vi.mock('../src/sbFetch', () => {
     },
     headers: {},
     status: 200,
-  })
-  const mockPost = vi.fn()
-  const mockSetFetchOptions = vi.fn()
+  });
+  const mockPost = vi.fn();
+  const mockSetFetchOptions = vi.fn();
 
   // Define a mock class with baseURL property
   class MockSbFetch {
-    private baseURL: string
-    private timeout?: number
-    private headers: Headers
-    private helpers: any
-    private responseInterceptor?: ResponseFn
+    private baseURL: string;
+    private timeout?: number;
+    private headers: Headers;
+    private helpers: any;
+    private responseInterceptor?: ResponseFn;
     constructor(config: any) {
-      this.helpers = new SbHelpers()
-      this.baseURL = config.baseURL || 'https://api.storyblok.com/v2'
-      this.responseInterceptor = config.responseInterceptor
+      this.helpers = new SbHelpers();
+      this.baseURL = config.baseURL || 'https://api.storyblok.com/v2';
+      this.responseInterceptor = config.responseInterceptor;
     }
-    public get = mockGet
-    public post = mockPost
-    public setFetchOptions = mockSetFetchOptions
+
+    public get = mockGet;
+    public post = mockPost;
+    public setFetchOptions = mockSetFetchOptions;
   }
 
   return {
     default: MockSbFetch,
-  }
-})
+  };
+});
 
-describe('StoryblokClient', () => {
-  let client
+describe('storyblokClient', () => {
+  let client;
 
   beforeEach(() => {
     // Setup default mocks
     client = new StoryblokClient({
       accessToken: 'test-token',
       /* fetch: mockFetch, */
-    })
-  })
+    });
+  });
 
   describe('initialization', () => {
     it('should initialize a client instance', () => {
-      expect(client).toBeDefined()
-      expect(client).toBeInstanceOf(StoryblokClient)
-    })
+      expect(client).toBeDefined();
+      expect(client).toBeInstanceOf(StoryblokClient);
+    });
 
     it('should initialize with default values', () => {
-      expect(client.maxRetries).toBe(10)
-      expect(client.retriesDelay).toBe(300)
+      expect(client.maxRetries).toBe(10);
+      expect(client.retriesDelay).toBe(300);
       expect(client.cache).toEqual({
         clear: 'manual',
-      })
-      expect(client.relations).toEqual({})
-      expect(client.links).toEqual({})
+      });
+      expect(client.relations).toEqual({});
+      expect(client.links).toEqual({});
       // Failing test
       /* expect(client.helpers).toBeInstanceOf(SbHelpers) */
-      expect(client.resolveCounter).toBe(0)
-      expect(client.resolveNestedRelations).toBeTruthy()
-      expect(client.stringifiedStoriesCache).toEqual({})
-    })
+      expect(client.resolveCounter).toBe(0);
+      expect(client.resolveNestedRelations).toBeTruthy();
+      expect(client.stringifiedStoriesCache).toEqual({});
+    });
 
     it('should set an accessToken', () => {
-      expect(client.accessToken).toBe('test-token')
-    })
+      expect(client.accessToken).toBe('test-token');
+    });
 
     it('should set an endpoint', () => {
-      expect(client.client.baseURL).toBe('https://api.storyblok.com/v2')
-    })
+      expect(client.client.baseURL).toBe('https://api.storyblok.com/v2');
+    });
 
     it('should set a fetch instance', () => {
-      expect(client.client).toBeInstanceOf(SbFetch)
-    })
-  })
+      expect(client.client).toBeInstanceOf(SbFetch);
+    });
+  });
 
   describe('configuration via options', () => {
     it('should set a custom endpoint', () => {
       client = new StoryblokClient({
         endpoint: 'https://api-custom.storyblok.com/v2',
-      })
-
-      expect(client.client.baseURL).toBe('https://api-custom.storyblok.com/v2')
+      });
 
-    })
+      expect(client.client.baseURL).toBe('https://api-custom.storyblok.com/v2');
+    });
     it('https: should set the http endpoint if option is set to false', () => {
       client = new StoryblokClient({
         accessToken: 'test-token',
         https: false,
-      })
+      });
 
-      expect(client.client.baseURL).toBe('http://api.storyblok.com/v2')
-    })
+      expect(client.client.baseURL).toBe('http://api.storyblok.com/v2');
+    });
     it('should set the management endpoint v1 if oauthToken is available', () => {
       client = new StoryblokClient({
         oauthToken: 'test-token',
-      })
+      });
 
-      expect(client.client.baseURL).toBe('https://api.storyblok.com/v1')
-    })
+      expect(client.client.baseURL).toBe('https://api.storyblok.com/v1');
+    });
     it('should set the correct region endpoint', () => {
       client = new StoryblokClient({
         region: 'us',
-      })
+      });
 
-      expect(client.client.baseURL).toBe('https://api-us.storyblok.com/v2')
-    })
+      expect(client.client.baseURL).toBe('https://api-us.storyblok.com/v2');
+    });
     it('should set maxRetries', () => {
       client = new StoryblokClient({
         maxRetries: 5,
-      })
+      });
 
-      expect(client.maxRetries).toBe(5)
-    })
+      expect(client.maxRetries).toBe(5);
+    });
     // TODO: seems like implmentation is missing
     it.skip('should desactivate resolveNestedRelations', () => {
       client = new StoryblokClient({
         resolveNestedRelations: false,
-      })
+      });
 
-      expect(client.resolveNestedRelations).toBeFalsy()
-    })
+      expect(client.resolveNestedRelations).toBeFalsy();
+    });
 
     it('should set automatic cache clearing', () => {
       client = new StoryblokClient({
         cache: {
           clear: 'auto',
         },
-      })
+      });
 
-      expect(client.cache.clear).toBe('auto')
-    })
+      expect(client.cache.clear).toBe('auto');
+    });
 
     it('should set a responseInterceptor', async () => {
       const responseInterceptor = (response) => {
-        return response
-      }
+        return response;
+      };
 
       client = new StoryblokClient({
         responseInterceptor,
-      })
-      await client.getAll('cdn/links')
-      expect(client.client.responseInterceptor).toBe(responseInterceptor)
-    })
-  })
+      });
+      await client.getAll('cdn/links');
+      expect(client.client.responseInterceptor).toBe(responseInterceptor);
+    });
+  });
 
   describe('cache', () => {
-
     it('should return cacheVersions', async () => {
       const mockThrottle = vi.fn().mockResolvedValue({
-        data: { 
+        data: {
           stories: [{ id: 1, title: 'Update' }],
-          cv: 1645521118
+          cv: 1645521118,
         },
         headers: {},
-        status: 200
+        status: 200,
       });
       client.throttle = mockThrottle;
       await client.get('test', { version: 'draft', token: 'test-token' });
-  
+
       expect(client.cacheVersions()).toEqual({
-        'test-token': 1645521118
+        'test-token': 1645521118,
       });
-    })
-  
+    });
+
     it('should return cacheVersion', async () => {
       const mockThrottle = vi.fn().mockResolvedValue({
-        data: { 
+        data: {
           stories: [{ id: 1, title: 'Update' }],
-          cv: 1645521118
+          cv: 1645521118,
         },
         headers: {},
-        status: 200
+        status: 200,
       });
       client.throttle = mockThrottle;
       await client.get('test', { version: 'draft', token: 'test-token' });
-  
+
       expect(client.cacheVersion('test-token')).toBe(1645521118);
-    })
+    });
 
     it('should set the cache version', async () => {
       client.setCacheVersion(1645521118);
       expect(client.cacheVersions()).toEqual({
-        'test-token': 1645521118
+        'test-token': 1645521118,
       });
-    })
+    });
 
     it('should clear the cache', async () => {
-       // Mock the cacheProvider and its flush method
+      // Mock the cacheProvider and its flush method
       client.cacheProvider = vi.fn().mockReturnValue({
         flush: vi.fn().mockResolvedValue(undefined),
       });
       // Mock the clearCacheVersion method
       client.clearCacheVersion = vi.fn();
-        await client.flushCache();
+      await client.flushCache();
 
       expect(client.cacheProvider().flush).toHaveBeenCalled();
       expect(client.clearCacheVersion).toHaveBeenCalled();
-    })
+    });
 
     it('should clear the cache version', async () => {
       client.clearCacheVersion('test-token');
       expect(client.cacheVersion()).toEqual(0);
-    })
+    });
 
     it('should flush the cache when the draft version is requested and clear is auto', async () => {
       client = new StoryblokClient({ cache: { clear: 'auto' } });
@@ -223,17 +223,19 @@ describe('StoryblokClient', () => {
       expect(client.cacheProvider().flush).toHaveBeenCalled();
       expect(client.clearCacheVersion).toHaveBeenCalled();
     });
-    
-  })
+  });
 
   describe('get', () => {
     it('should fetch data from the API', async () => {
-      const result = await client.get('test')
-      expect(result).toEqual({ data: {
-        links: 'Test data',
-      }, headers: {} })
-    })
-  })
+      const result = await client.get('test');
+      expect(result).toEqual({
+        data: {
+          links: 'Test data',
+        },
+        headers: {},
+      });
+    });
+  });
 
   describe('getAll', () => {
     it('should fetch all data from the API', async () => {
@@ -246,14 +248,14 @@ describe('StoryblokClient', () => {
         },
         headers: {},
         status: 200,
-      })
-      client.makeRequest = mockMakeRequest
-      const result = await client.getAll('links', { version: 'draft' })
+      });
+      client.makeRequest = mockMakeRequest;
+      const result = await client.getAll('links', { version: 'draft' });
       expect(result).toEqual([
         { id: 1, name: 'Test 1' },
         { id: 2, name: 'Test 2' },
-      ])
-    })
+      ]);
+    });
 
     it('should resolve using entity option', async () => {
       const mockMakeRequest = vi.fn().mockResolvedValue({
@@ -265,14 +267,18 @@ describe('StoryblokClient', () => {
         },
         headers: {},
         status: 200,
-      })
-      client.makeRequest = mockMakeRequest
-      const result = await client.getAll('cdn/links', { version: 'draft' }, 'custom')
+      });
+      client.makeRequest = mockMakeRequest;
+      const result = await client.getAll(
+        'cdn/links',
+        { version: 'draft' },
+        'custom',
+      );
       expect(result).toEqual([
         { id: 1, name: 'Test 1' },
         { id: 2, name: 'Test 2' },
-      ])
-    })
+      ]);
+    });
 
     it('should make a request for each page', async () => {
       const mockMakeRequest = vi.fn().mockResolvedValue({
@@ -284,11 +290,11 @@ describe('StoryblokClient', () => {
         },
         total: 2,
         status: 200,
-      })
-      client.makeRequest = mockMakeRequest
-      await client.getAll('links', { per_page: 1 })
-      expect(mockMakeRequest).toBeCalledTimes(2)
-    })
+      });
+      client.makeRequest = mockMakeRequest;
+      await client.getAll('links', { per_page: 1 });
+      expect(mockMakeRequest).toBeCalledTimes(2);
+    });
 
     it('should get all stories if the slug is passed with the trailing slash', async () => {
       const mockMakeRequest = vi.fn().mockResolvedValue({
@@ -300,101 +306,101 @@ describe('StoryblokClient', () => {
         },
         total: 2,
         status: 200,
-      })
-      client.makeRequest = mockMakeRequest
-      const result = await client.getAll('cdn/stories/', { version: 'draft' })
+      });
+      client.makeRequest = mockMakeRequest;
+      const result = await client.getAll('cdn/stories/', { version: 'draft' });
       expect(result).toEqual([
         { id: 1, name: 'Test Story 1' },
         { id: 2, name: 'Test Story 2' },
-      ])
-    })
-  })
+      ]);
+    });
+  });
 
   describe('post', () => {
     it('should post data to the API', async () => {
       const mockThrottle = vi.fn().mockResolvedValue({
-        data: { 
-          stories: [{ id: 1, title: 'Keep me posted' }] 
+        data: {
+          stories: [{ id: 1, title: 'Keep me posted' }],
         },
         headers: {},
-        status: 200
+        status: 200,
       });
       client.throttle = mockThrottle;
-      const result = await client.post('test', { data: 'test' })
-      expect(result).toEqual({ 
+      const result = await client.post('test', { data: 'test' });
+      expect(result).toEqual({
         data: {
-          stories: [{ id: 1, title: 'Keep me posted' }]
-        }, 
+          stories: [{ id: 1, title: 'Keep me posted' }],
+        },
         headers: {},
-        status: 200 
-      })
-    })
-  })
+        status: 200,
+      });
+    });
+  });
 
   describe('put', () => {
     it('should put data to the API', async () => {
       const mockThrottle = vi.fn().mockResolvedValue({
-        data: { 
-          stories: [{ id: 1, title: 'Update' }] 
+        data: {
+          stories: [{ id: 1, title: 'Update' }],
         },
         headers: {},
-        status: 200
+        status: 200,
       });
       client.throttle = mockThrottle;
-      const result = await client.put('test', { data: 'test' })
-      expect(result).toEqual({ 
+      const result = await client.put('test', { data: 'test' });
+      expect(result).toEqual({
         data: {
-          stories: [{ id: 1, title: 'Update' }]
-        }, 
+          stories: [{ id: 1, title: 'Update' }],
+        },
         headers: {},
-        status: 200 
-      })
-    })
-  })
+        status: 200,
+      });
+    });
+  });
 
   describe('delete', () => {
     it('should delete data from the API', async () => {
       const mockThrottle = vi.fn().mockResolvedValue({
-        data: { 
-          stories: [{ id: 1, title: 'Delete' }] 
+        data: {
+          stories: [{ id: 1, title: 'Delete' }],
         },
         headers: {},
-        status: 200
+        status: 200,
       });
       client.throttle = mockThrottle;
-      const result = await client.delete('test')
-      expect(result).toEqual({ 
+      const result = await client.delete('test');
+      expect(result).toEqual({
         data: {
-          stories: [{ id: 1, title: 'Delete' }]
-        }, 
+          stories: [{ id: 1, title: 'Delete' }],
+        },
         headers: {},
-        status: 200 
-      })
-    })
-  })
+        status: 200,
+      });
+    });
+  });
 
   it('should resolve stories when response contains a story or stories', async () => {
     const mockThrottle = vi.fn().mockResolvedValue({
       data: { stories: [{ id: 1, title: 'Test Story' }] },
       headers: {},
-      status: 200
+      status: 200,
     });
     client.throttle = mockThrottle;
     client.resolveStories = vi.fn().mockResolvedValue({
       id: 1,
       title: 'Test Story',
     });
-  
-    await client.cacheResponse('/test-url', { token: 'test-token', version: 'published' });
-  
+
+    await client.cacheResponse('/test-url', {
+      token: 'test-token',
+      version: 'published',
+    });
+
     expect(client.resolveStories).toHaveBeenCalled();
     expect(client.resolveCounter).toBe(1);
   });
 
- it('should return access token', () => {
+  it('should return access token', () => {
     expect(client.getToken()).toBe('test-token');
-  })
-
- 
-
-})
+  });
+});
diff --git a/src/index.ts b/src/index.ts
index 07225309..47d92f78 100755
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,212 +1,217 @@
-import throttledQueue from './throttlePromise'
-import RichTextResolver from './richTextResolver'
-import { SbHelpers } from './sbHelpers'
-import SbFetch from './sbFetch'
-import { STORYBLOK_AGENT, STORYBLOK_JS_CLIENT_AGENT } from './constants'
-
-import Method from './constants'
-import {
-  ISbStoriesParams,
+import throttledQueue from './throttlePromise';
+import RichTextResolver from './richTextResolver';
+import { SbHelpers } from './sbHelpers';
+import SbFetch from './sbFetch';
+import type Method from './constants';
+import { STORYBLOK_AGENT, STORYBLOK_JS_CLIENT_AGENT } from './constants';
+
+import type {
+  ICacheProvider,
+  IMemoryType,
   ISbCache,
   ISbConfig,
+  ISbContentMangmntAPI,
+  ISbCustomFetch,
   ISbLinkURLObject,
+  ISbNode,
   ISbResult,
   ISbStories,
+  ISbStoriesParams,
   ISbStory,
   ISbStoryData,
   ISbStoryParams,
-  ISbContentMangmntAPI,
-  ISbNode,
   ThrottleFn,
-  IMemoryType,
-  ICacheProvider,
-  ISbCustomFetch,
-} from './interfaces'
+} from './interfaces';
 
-let memory: Partial = {}
+let memory: Partial = {};
 
-const cacheVersions = {} as CachedVersions
+const cacheVersions = {} as CachedVersions;
 
-type ComponentResolverFn = {
-  (...args: any): any
+interface ComponentResolverFn {
+  (...args: any): any;
 }
 
-type CachedVersions = {
-  [key: string]: number
+interface CachedVersions {
+  [key: string]: number;
 }
 
-type LinksType = {
-  [key: string]: any
+interface LinksType {
+  [key: string]: any;
 }
 
-type RelationsType = {
-  [key: string]: any
+interface RelationsType {
+  [key: string]: any;
 }
 
 interface ISbFlatMapped {
-  data: any
+  data: any;
 }
 
 export interface ISbResponseData {
-  link_uuids: string[]
-  links: string[]
-  rel_uuids: string[]
-  rels: any
-  story: ISbStoryData
-  stories: Array
+  link_uuids: string[];
+  links: string[];
+  rel_uuids: string[];
+  rels: any;
+  story: ISbStoryData;
+  stories: Array;
 }
 
-const VERSION = {
+const _VERSION = {
   V1: 'v1',
   V2: 'v2',
-} as const
+} as const;
 
-type ObjectValues = T[keyof T]
-type Version = ObjectValues
+type ObjectValues = T[keyof T];
+type Version = ObjectValues;
 
 class Storyblok {
-  private client: SbFetch
-  private maxRetries: number
-  private retriesDelay: number
-  private throttle: ThrottleFn
-  private accessToken: string
-  private cache: ISbCache
-  private helpers: SbHelpers
-  private resolveCounter: number
-  public relations: RelationsType
-  public links: LinksType
+  private client: SbFetch;
+  private maxRetries: number;
+  private retriesDelay: number;
+  private throttle: ThrottleFn;
+  private accessToken: string;
+  private cache: ISbCache;
+  private helpers: SbHelpers;
+  private resolveCounter: number;
+  public relations: RelationsType;
+  public links: LinksType;
   // TODO: Remove on v7.x.x
-  public richTextResolver: RichTextResolver
-  public resolveNestedRelations: boolean
-  private stringifiedStoriesCache: Record
+  public richTextResolver: RichTextResolver;
+  public resolveNestedRelations: boolean;
+  private stringifiedStoriesCache: Record;
 
   /**
    *
    * @param config ISbConfig interface
-   * @param endpoint string, optional
+   * @param pEndpoint string, optional
    */
   public constructor(config: ISbConfig, pEndpoint?: string) {
-    let endpoint = config.endpoint || pEndpoint
+    let endpoint = config.endpoint || pEndpoint;
 
     if (!endpoint) {
-      const getRegion = new SbHelpers().getRegionURL
-      const protocol = config.https === false ? 'http' : 'https'
+      const getRegion = new SbHelpers().getRegionURL;
+      const protocol = config.https === false ? 'http' : 'https';
 
       if (!config.oauthToken) {
-        endpoint = `${protocol}://${getRegion(config.region)}/${'v2' as Version}`
-      } else {
-        endpoint = `${protocol}://${getRegion(config.region)}/${'v1' as Version}`
+        endpoint = `${protocol}://${getRegion(config.region)}/${'v2' as Version}`;
+      }
+      else {
+        endpoint = `${protocol}://${getRegion(config.region)}/${'v1' as Version}`;
       }
     }
 
-    const headers: Headers = new Headers()
+    const headers: Headers = new Headers();
 
-    headers.set('Content-Type', 'application/json')
-    headers.set('Accept', 'application/json')
+    headers.set('Content-Type', 'application/json');
+    headers.set('Accept', 'application/json');
 
     if (config.headers) {
-      const entries = (config.headers.constructor.name === 'Headers') ? config.headers.entries().toArray() : Object.entries(config.headers)
+      const entries
+        = config.headers.constructor.name === 'Headers'
+          ? config.headers.entries().toArray()
+          : Object.entries(config.headers);
 
       entries.forEach(([key, value]: [string, string]) => {
-        headers.set(key, value)
-      })
+        headers.set(key, value);
+      });
     }
 
     if (!headers.has(STORYBLOK_AGENT)) {
-      headers.set(STORYBLOK_AGENT, STORYBLOK_JS_CLIENT_AGENT.defaultAgentName)
+      headers.set(STORYBLOK_AGENT, STORYBLOK_JS_CLIENT_AGENT.defaultAgentName);
       headers.set(
         STORYBLOK_JS_CLIENT_AGENT.defaultAgentVersion,
-        STORYBLOK_JS_CLIENT_AGENT.packageVersion
-      )
+        STORYBLOK_JS_CLIENT_AGENT.packageVersion,
+      );
     }
 
-    let rateLimit = 5 // per second for cdn api
+    let rateLimit = 5; // per second for cdn api
 
     if (config.oauthToken) {
-      headers.set('Authorization', config.oauthToken)
-      rateLimit = 3 // per second for management api
+      headers.set('Authorization', config.oauthToken);
+      rateLimit = 3; // per second for management api
     }
 
     if (config.rateLimit) {
-      rateLimit = config.rateLimit
+      rateLimit = config.rateLimit;
     }
 
     if (config.richTextSchema) {
-      this.richTextResolver = new RichTextResolver(config.richTextSchema)
-    } else {
-      this.richTextResolver = new RichTextResolver()
+      this.richTextResolver = new RichTextResolver(config.richTextSchema);
+    }
+    else {
+      this.richTextResolver = new RichTextResolver();
     }
 
     if (config.componentResolver) {
-      this.setComponentResolver(config.componentResolver)
+      this.setComponentResolver(config.componentResolver);
     }
 
-    this.maxRetries = config.maxRetries || 10
-    this.retriesDelay = 300
-    this.throttle = throttledQueue(this.throttledRequest, rateLimit, 1000)
-    this.accessToken = config.accessToken || ''
-    this.relations = {} as RelationsType
-    this.links = {} as LinksType
-    this.cache = config.cache || { clear: 'manual' }
-    this.helpers = new SbHelpers()
-    this.resolveCounter = 0
-    this.resolveNestedRelations = config.resolveNestedRelations || true
-    this.stringifiedStoriesCache = {} as Record
+    this.maxRetries = config.maxRetries || 10;
+    this.retriesDelay = 300;
+    this.throttle = throttledQueue(this.throttledRequest, rateLimit, 1000);
+    this.accessToken = config.accessToken || '';
+    this.relations = {} as RelationsType;
+    this.links = {} as LinksType;
+    this.cache = config.cache || { clear: 'manual' };
+    this.helpers = new SbHelpers();
+    this.resolveCounter = 0;
+    this.resolveNestedRelations = config.resolveNestedRelations || true;
+    this.stringifiedStoriesCache = {} as Record;
 
     this.client = new SbFetch({
       baseURL: endpoint,
       timeout: config.timeout || 0,
-      headers: headers,
+      headers,
       responseInterceptor: config.responseInterceptor,
       fetch: config.fetch,
-    })
+    });
   }
 
   public setComponentResolver(resolver: ComponentResolverFn): void {
     this.richTextResolver.addNode('blok', (node: ISbNode) => {
-      let html = ''
+      let html = '';
 
       if (node.attrs.body) {
         node.attrs.body.forEach((blok) => {
-          html += resolver(blok.component, blok)
-        })
+          html += resolver(blok.component, blok);
+        });
       }
 
       return {
-        html: html,
-      }
-    })
+        html,
+      };
+    });
   }
 
   private parseParams(params: ISbStoriesParams): ISbStoriesParams {
     if (!params.token) {
-      params.token = this.getToken()
+      params.token = this.getToken();
     }
 
     if (!params.cv) {
-      params.cv = cacheVersions[params.token]
+      params.cv = cacheVersions[params.token];
     }
 
     if (Array.isArray(params.resolve_relations)) {
-      params.resolve_relations = params.resolve_relations.join(',')
+      params.resolve_relations = params.resolve_relations.join(',');
     }
 
     if (typeof params.resolve_relations !== 'undefined') {
-      params.resolve_level = 2
+      params.resolve_level = 2;
     }
 
-    return params
+    return params;
   }
 
   private factoryParamOptions(
     url: string,
-    params: ISbStoriesParams
+    params: ISbStoriesParams,
   ): ISbStoriesParams {
     if (this.helpers.isCDNUrl(url)) {
-      return this.parseParams(params)
+      return this.parseParams(params);
     }
 
-    return params
+    return params;
   }
 
   private makeRequest(
@@ -214,149 +219,151 @@ class Storyblok {
     params: ISbStoriesParams,
     per_page: number,
     page: number,
-    fetchOptions?: ISbCustomFetch
+    fetchOptions?: ISbCustomFetch,
   ): Promise {
     const query = this.factoryParamOptions(
       url,
-      this.helpers.getOptionsPage(params, per_page, page)
-    )
+      this.helpers.getOptionsPage(params, per_page, page),
+    );
 
-    return this.cacheResponse(url, query, undefined, fetchOptions)
+    return this.cacheResponse(url, query, undefined, fetchOptions);
   }
 
   public get(
     slug: string,
     params?: ISbStoriesParams,
-    fetchOptions?: ISbCustomFetch
+    fetchOptions?: ISbCustomFetch,
   ): Promise {
-    if (!params) params = {} as ISbStoriesParams
-    const url = `/${slug}`
-    const query = this.factoryParamOptions(url, params)
+    if (!params) {
+      params = {} as ISbStoriesParams;
+    }
+    const url = `/${slug}`;
+    const query = this.factoryParamOptions(url, params);
 
-    return this.cacheResponse(url, query, undefined, fetchOptions)
+    return this.cacheResponse(url, query, undefined, fetchOptions);
   }
 
   public async getAll(
     slug: string,
     params: ISbStoriesParams,
     entity?: string,
-    fetchOptions?: ISbCustomFetch
+    fetchOptions?: ISbCustomFetch,
   ): Promise {
-    const perPage = params?.per_page || 25
-    const url = `/${slug}`.replace(/\/$/, '')
-    const e = entity ?? url.substring(url.lastIndexOf('/') + 1)
+    const perPage = params?.per_page || 25;
+    const url = `/${slug}`.replace(/\/$/, '');
+    const e = entity ?? url.substring(url.lastIndexOf('/') + 1);
 
-    const firstPage = 1
+    const firstPage = 1;
     const firstRes = await this.makeRequest(
       url,
       params,
       perPage,
       firstPage,
-      fetchOptions
-    )
-    const lastPage = firstRes.total ? Math.ceil(firstRes.total / perPage) : 1
+      fetchOptions,
+    );
+    const lastPage = firstRes.total ? Math.ceil(firstRes.total / perPage) : 1;
 
     const restRes: any = await this.helpers.asyncMap(
       this.helpers.range(firstPage, lastPage),
       (i: number) => {
-        return this.makeRequest(url, params, perPage, i + 1, fetchOptions)
-      }
-    )
+        return this.makeRequest(url, params, perPage, i + 1, fetchOptions);
+      },
+    );
 
     return this.helpers.flatMap([firstRes, ...restRes], (res: ISbFlatMapped) =>
-      Object.values(res.data[e])
-    )
+      Object.values(res.data[e]));
   }
 
   public post(
     slug: string,
     params: ISbStoriesParams | ISbContentMangmntAPI,
-    fetchOptions?: ISbCustomFetch
+    fetchOptions?: ISbCustomFetch,
   ): Promise {
-    const url = `/${slug}`
+    const url = `/${slug}`;
 
-    return Promise.resolve(this.throttle('post', url, params, fetchOptions))
+    return Promise.resolve(this.throttle('post', url, params, fetchOptions));
   }
 
   public put(
     slug: string,
     params: ISbStoriesParams | ISbContentMangmntAPI,
-    fetchOptions?: ISbCustomFetch
+    fetchOptions?: ISbCustomFetch,
   ): Promise {
-    const url = `/${slug}`
+    const url = `/${slug}`;
 
-    return Promise.resolve(this.throttle('put', url, params, fetchOptions))
+    return Promise.resolve(this.throttle('put', url, params, fetchOptions));
   }
 
   public delete(
     slug: string,
     params: ISbStoriesParams | ISbContentMangmntAPI,
-    fetchOptions?: ISbCustomFetch
+    fetchOptions?: ISbCustomFetch,
   ): Promise {
-    const url = `/${slug}`
+    const url = `/${slug}`;
 
-    return Promise.resolve(this.throttle('delete', url, params, fetchOptions))
+    return Promise.resolve(this.throttle('delete', url, params, fetchOptions));
   }
 
   public getStories(
     params: ISbStoriesParams,
-    fetchOptions?: ISbCustomFetch
+    fetchOptions?: ISbCustomFetch,
   ): Promise {
-    this._addResolveLevel(params)
+    this._addResolveLevel(params);
 
-    return this.get('cdn/stories', params, fetchOptions)
+    return this.get('cdn/stories', params, fetchOptions);
   }
 
   public getStory(
     slug: string,
     params: ISbStoryParams,
-    fetchOptions?: ISbCustomFetch
+    fetchOptions?: ISbCustomFetch,
   ): Promise {
-    this._addResolveLevel(params)
+    this._addResolveLevel(params);
 
-    return this.get(`cdn/stories/${slug}`, params, fetchOptions)
+    return this.get(`cdn/stories/${slug}`, params, fetchOptions);
   }
 
   private getToken(): string {
-    return this.accessToken
+    return this.accessToken;
   }
 
   public ejectInterceptor(): void {
-    this.client.eject()
+    this.client.eject();
   }
 
   private _addResolveLevel(params: ISbStoriesParams | ISbStoryParams): void {
     if (typeof params.resolve_relations !== 'undefined') {
-      params.resolve_level = 2
+      params.resolve_level = 2;
     }
   }
 
   private _cleanCopy(value: LinksType): JSON {
-    return JSON.parse(JSON.stringify(value))
+    return JSON.parse(JSON.stringify(value));
   }
 
   private _insertLinks(
     jtree: ISbStoriesParams,
     treeItem: keyof ISbStoriesParams,
-    resolveId: string
+    resolveId: string,
   ): void {
-    const node = jtree[treeItem]
+    const node = jtree[treeItem];
 
     if (
-      node &&
-      node.fieldtype == 'multilink' &&
-      node.linktype == 'story' &&
-      typeof node.id === 'string' &&
-      this.links[resolveId][node.id]
+      node
+      && node.fieldtype === 'multilink'
+      && node.linktype === 'story'
+      && typeof node.id === 'string'
+      && this.links[resolveId][node.id]
     ) {
-      node.story = this._cleanCopy(this.links[resolveId][node.id])
-    } else if (
-      node &&
-      node.linktype === 'story' &&
-      typeof node.uuid === 'string' &&
-      this.links[resolveId][node.uuid]
+      node.story = this._cleanCopy(this.links[resolveId][node.id]);
+    }
+    else if (
+      node
+      && node.linktype === 'story'
+      && typeof node.uuid === 'string'
+      && this.links[resolveId][node.uuid]
     ) {
-      node.story = this._cleanCopy(this.links[resolveId][node.uuid])
+      node.story = this._cleanCopy(this.links[resolveId][node.uuid]);
     }
   }
 
@@ -367,27 +374,31 @@ class Storyblok {
    * @returns string | object
    */
   private getStoryReference(resolveId: string, uuid: string): string | JSON {
-    if (!this.relations[resolveId][uuid]) return uuid
-    if (!this.stringifiedStoriesCache[uuid])
+    if (!this.relations[resolveId][uuid]) {
+      return uuid;
+    }
+    if (!this.stringifiedStoriesCache[uuid]) {
       this.stringifiedStoriesCache[uuid] = JSON.stringify(
-        this.relations[resolveId][uuid]
-      )
-    return JSON.parse(this.stringifiedStoriesCache[uuid])
+        this.relations[resolveId][uuid],
+      );
+    }
+    return JSON.parse(this.stringifiedStoriesCache[uuid]);
   }
 
   private _insertRelations(
     jtree: ISbStoriesParams,
     treeItem: keyof ISbStoriesParams,
     fields: string | Array,
-    resolveId: string
+    resolveId: string,
   ): void {
-    if (fields.indexOf(`${jtree.component}.${treeItem}`) > -1) {
+    if (fields.includes(`${jtree.component}.${treeItem}`)) {
       if (typeof jtree[treeItem] === 'string') {
-        jtree[treeItem] = this.getStoryReference(resolveId, jtree[treeItem])
-      } else if (Array.isArray(jtree[treeItem])) {
+        jtree[treeItem] = this.getStoryReference(resolveId, jtree[treeItem]);
+      }
+      else if (Array.isArray(jtree[treeItem])) {
         jtree[treeItem] = jtree[treeItem as keyof ISbStoriesParams]
           .map((uuid: string) => this.getStoryReference(resolveId, uuid))
-          .filter(Boolean)
+          .filter(Boolean);
       }
     }
   }
@@ -395,19 +406,20 @@ class Storyblok {
   private iterateTree(
     story: ISbStoryData,
     fields: string | Array,
-    resolveId: string
+    resolveId: string,
   ): void {
     const enrich = (jtree: ISbStoriesParams | any) => {
       if (jtree == null) {
-        return
+        return;
       }
       if (jtree.constructor === Array) {
         for (let item = 0; item < jtree.length; item++) {
-          enrich(jtree[item])
+          enrich(jtree[item]);
         }
-      } else if (jtree.constructor === Object) {
+      }
+      else if (jtree.constructor === Object) {
         if (jtree._stopResolving) {
-          return
+          return;
         }
         for (const treeItem in jtree) {
           if ((jtree.component && jtree._uid) || jtree.type === 'link') {
@@ -415,37 +427,37 @@ class Storyblok {
               jtree,
               treeItem as keyof ISbStoriesParams,
               fields,
-              resolveId
-            )
+              resolveId,
+            );
             this._insertLinks(
               jtree,
               treeItem as keyof ISbStoriesParams,
-              resolveId
-            )
+              resolveId,
+            );
           }
-          enrich(jtree[treeItem])
+          enrich(jtree[treeItem]);
         }
       }
-    }
+    };
 
-    enrich(story.content)
+    enrich(story.content);
   }
 
   private async resolveLinks(
     responseData: ISbResponseData,
     params: ISbStoriesParams,
-    resolveId: string
+    resolveId: string,
   ): Promise {
-    let links: (ISbStoryData | ISbLinkURLObject | string)[] = []
+    let links: (ISbStoryData | ISbLinkURLObject | string)[] = [];
 
     if (responseData.link_uuids) {
-      const relSize = responseData.link_uuids.length
-      const chunks = []
-      const chunkSize = 50
+      const relSize = responseData.link_uuids.length;
+      const chunks = [];
+      const chunkSize = 50;
 
       for (let i = 0; i < relSize; i += chunkSize) {
-        const end = Math.min(relSize, i + chunkSize)
-        chunks.push(responseData.link_uuids.slice(i, end))
+        const end = Math.min(relSize, i + chunkSize);
+        chunks.push(responseData.link_uuids.slice(i, end));
       }
 
       for (let chunkIndex = 0; chunkIndex < chunks.length; chunkIndex++) {
@@ -454,41 +466,42 @@ class Storyblok {
           language: params.language,
           version: params.version,
           by_uuids: chunks[chunkIndex].join(','),
-        })
+        });
 
         linksRes.data.stories.forEach(
           (rel: ISbStoryData | ISbLinkURLObject | string) => {
-            links.push(rel)
-          }
-        )
+            links.push(rel);
+          },
+        );
       }
-    } else {
-      links = responseData.links
+    }
+    else {
+      links = responseData.links;
     }
 
     links.forEach((story: ISbStoryData | any) => {
       this.links[resolveId][story.uuid] = {
         ...story,
         ...{ _stopResolving: true },
-      }
-    })
+      };
+    });
   }
 
   private async resolveRelations(
     responseData: ISbResponseData,
     params: ISbStoriesParams,
-    resolveId: string
+    resolveId: string,
   ): Promise {
-    let relations = []
+    let relations = [];
 
     if (responseData.rel_uuids) {
-      const relSize = responseData.rel_uuids.length
-      const chunks = []
-      const chunkSize = 50
+      const relSize = responseData.rel_uuids.length;
+      const chunks = [];
+      const chunkSize = 50;
 
       for (let i = 0; i < relSize; i += chunkSize) {
-        const end = Math.min(relSize, i + chunkSize)
-        chunks.push(responseData.rel_uuids.slice(i, end))
+        const end = Math.min(relSize, i + chunkSize);
+        chunks.push(responseData.rel_uuids.slice(i, end));
       }
 
       for (let chunkIndex = 0; chunkIndex < chunks.length; chunkIndex++) {
@@ -498,14 +511,15 @@ class Storyblok {
           version: params.version,
           by_uuids: chunks[chunkIndex].join(','),
           excluding_fields: params.excluding_fields,
-        })
+        });
 
         relationsRes.data.stories.forEach((rel: ISbStoryData) => {
-          relations.push(rel)
-        })
+          relations.push(rel);
+        });
       }
-    } else {
-      relations = responseData.rels
+    }
+    else {
+      relations = responseData.rels;
     }
 
     if (relations && relations.length > 0) {
@@ -513,8 +527,8 @@ class Storyblok {
         this.relations[resolveId][story.uuid] = {
           ...story,
           ...{ _stopResolving: true },
-        }
-      })
+        };
+      });
     }
   }
 
@@ -530,29 +544,29 @@ class Storyblok {
   private async resolveStories(
     responseData: ISbResponseData,
     params: ISbStoriesParams,
-    resolveId: string
+    resolveId: string,
   ): Promise {
-    let relationParams: string[] = []
+    let relationParams: string[] = [];
 
-    this.links[resolveId] = {}
-    this.relations[resolveId] = {}
+    this.links[resolveId] = {};
+    this.relations[resolveId] = {};
 
     if (
-      typeof params.resolve_relations !== 'undefined' &&
-      params.resolve_relations.length > 0
+      typeof params.resolve_relations !== 'undefined'
+      && params.resolve_relations.length > 0
     ) {
       if (typeof params.resolve_relations === 'string') {
-        relationParams = params.resolve_relations.split(',')
+        relationParams = params.resolve_relations.split(',');
       }
-      await this.resolveRelations(responseData, params, resolveId)
+      await this.resolveRelations(responseData, params, resolveId);
     }
 
     if (
-      params.resolve_links &&
-      ['1', 'story', 'url', 'link'].indexOf(params.resolve_links) > -1 &&
-      (responseData.links?.length || responseData.link_uuids?.length)
+      params.resolve_links
+      && ['1', 'story', 'url', 'link'].includes(params.resolve_links)
+      && (responseData.links?.length || responseData.link_uuids?.length)
     ) {
-      await this.resolveLinks(responseData, params, resolveId)
+      await this.resolveLinks(responseData, params, resolveId);
     }
 
     if (this.resolveNestedRelations) {
@@ -560,128 +574,133 @@ class Storyblok {
         this.iterateTree(
           this.relations[resolveId][relUuid],
           relationParams,
-          resolveId
-        )
+          resolveId,
+        );
       }
     }
 
     if (responseData.story) {
-      this.iterateTree(responseData.story, relationParams, resolveId)
-    } else {
+      this.iterateTree(responseData.story, relationParams, resolveId);
+    }
+    else {
       responseData.stories.forEach((story: ISbStoryData) => {
-        this.iterateTree(story, relationParams, resolveId)
-      })
+        this.iterateTree(story, relationParams, resolveId);
+      });
     }
 
-    this.stringifiedStoriesCache = {}
+    this.stringifiedStoriesCache = {};
 
-    delete this.links[resolveId]
-    delete this.relations[resolveId]
+    delete this.links[resolveId];
+    delete this.relations[resolveId];
   }
 
   private async cacheResponse(
     url: string,
     params: ISbStoriesParams,
     retries?: number,
-    fetchOptions?: ISbCustomFetch
+    fetchOptions?: ISbCustomFetch,
   ): Promise {
-    const cacheKey = this.helpers.stringify({ url: url, params: params })
-    const provider = this.cacheProvider()
+    const cacheKey = this.helpers.stringify({ url, params });
+    const provider = this.cacheProvider();
 
     if (this.cache.clear === 'auto' && params.version === 'draft') {
-      await this.flushCache()
+      await this.flushCache();
     }
 
-    if (params.version === 'published' && url != '/cdn/spaces/me') {
-      const cache = await provider.get(cacheKey)
+    if (params.version === 'published' && url !== '/cdn/spaces/me') {
+      const cache = await provider.get(cacheKey);
       if (cache) {
-        return Promise.resolve(cache)
+        return Promise.resolve(cache);
       }
     }
 
     return new Promise(async (resolve, reject) => {
       try {
-        const res = await this.throttle('get', url, params, fetchOptions)
+        const res = await this.throttle('get', url, params, fetchOptions);
         if (res.status !== 200) {
-          return reject(res)
+          return reject(res);
         }
 
-        let response = { data: res.data, headers: res.headers } as ISbResult
+        let response = { data: res.data, headers: res.headers } as ISbResult;
 
         if (res.headers?.['per-page']) {
           response = Object.assign({}, response, {
             perPage: res.headers['per-page']
-              ? parseInt(res.headers['per-page'])
+              ? Number.parseInt(res.headers['per-page'])
+              : 0,
+            total: res.headers['per-page']
+              ? Number.parseInt(res.headers.total)
               : 0,
-            total: res.headers['per-page'] ? parseInt(res.headers['total']) : 0,
-          })
+          });
         }
 
         if (response.data.story || response.data.stories) {
-          const resolveId = (this.resolveCounter = ++this.resolveCounter % 1000)
-          await this.resolveStories(response.data, params, `${resolveId}`)
+          const resolveId = (this.resolveCounter = ++this.resolveCounter % 1000);
+          await this.resolveStories(response.data, params, `${resolveId}`);
         }
 
-        if (params.version === 'published' && url != '/cdn/spaces/me') {
-          await provider.set(cacheKey, response)
+        if (params.version === 'published' && url !== '/cdn/spaces/me') {
+          await provider.set(cacheKey, response);
         }
 
         if (
-            response.data.cv
-            && params.token
-            && cacheVersions[params.token] != response.data.cv
+          response.data.cv
+          && params.token
+          && cacheVersions[params.token] !== response.data.cv
         ) {
-          await this.flushCache()
-          cacheVersions[params.token] = response.data.cv
+          await this.flushCache();
+          cacheVersions[params.token] = response.data.cv;
         }
 
-        return resolve(response)
-      } catch (error: Error | any) {
+        return resolve(response);
+      }
+      catch (error: Error | any) {
         if (error.response && error.status === 429) {
-          retries = typeof retries === 'undefined' ? 0 : retries + 1
+          retries = typeof retries === 'undefined' ? 0 : retries + 1;
 
           if (retries < this.maxRetries) {
+            // eslint-disable-next-line no-console
             console.log(
-              `Hit rate limit. Retrying in ${this.retriesDelay / 1000} seconds.`
-            )
-            await this.helpers.delay(this.retriesDelay)
+              `Hit rate limit. Retrying in ${this.retriesDelay / 1000} seconds.`,
+            );
+            await this.helpers.delay(this.retriesDelay);
             return this.cacheResponse(url, params, retries)
               .then(resolve)
-              .catch(reject)
+              .catch(reject);
           }
         }
-        reject(error)
+        reject(error);
       }
-    })
+    });
   }
 
   private throttledRequest(
     type: Method,
     url: string,
     params: ISbStoriesParams,
-    fetchOptions?: ISbCustomFetch
+    fetchOptions?: ISbCustomFetch,
   ): Promise {
-    this.client.setFetchOptions(fetchOptions)
-    return this.client[type](url, params)
+    this.client.setFetchOptions(fetchOptions);
+    return this.client[type](url, params);
   }
 
   public cacheVersions(): CachedVersions {
-    return cacheVersions
+    return cacheVersions;
   }
 
   public cacheVersion(): number {
-    return cacheVersions[this.accessToken]
+    return cacheVersions[this.accessToken];
   }
 
   public setCacheVersion(cv: number): void {
     if (this.accessToken) {
-      cacheVersions[this.accessToken] = cv
+      cacheVersions[this.accessToken] = cv;
     }
   }
 
   public clearCacheVersion(): void {
     if (this.accessToken) {
-      cacheVersions[this.accessToken] = 0
+      cacheVersions[this.accessToken] = 0;
     }
   }
 
@@ -690,46 +709,48 @@ class Storyblok {
       case 'memory':
         return {
           get(key: string) {
-            return Promise.resolve(memory[key])
+            return Promise.resolve(memory[key]);
           },
           getAll() {
-            return Promise.resolve(memory as IMemoryType)
+            return Promise.resolve(memory as IMemoryType);
           },
           set(key: string, content: ISbResult) {
-            memory[key] = content
-            return Promise.resolve(undefined)
+            memory[key] = content;
+            return Promise.resolve(undefined);
           },
           flush() {
-            memory = {}
-            return Promise.resolve(undefined)
+            memory = {};
+            return Promise.resolve(undefined);
           },
-        }
+        };
       case 'custom':
-        if (this.cache.custom) return this.cache.custom
+        if (this.cache.custom) {
+          return this.cache.custom;
+        }
       // eslint-disable-next-line no-fallthrough
       default:
         return {
           get() {
-            return Promise.resolve()
+            return Promise.resolve();
           },
           getAll() {
-            return Promise.resolve(undefined)
+            return Promise.resolve(undefined);
           },
           set() {
-            return Promise.resolve(undefined)
+            return Promise.resolve(undefined);
           },
           flush() {
-            return Promise.resolve(undefined)
+            return Promise.resolve(undefined);
           },
-        }
+        };
     }
   }
 
   public async flushCache(): Promise {
-    await this.cacheProvider().flush()
-    this.clearCacheVersion()
-    return this
+    await this.cacheProvider().flush();
+    this.clearCacheVersion();
+    return this;
   }
 }
 
-export default Storyblok
\ No newline at end of file
+export default Storyblok;
diff --git a/src/interfaces.ts b/src/interfaces.ts
index 9c009e8a..f3f5704f 100644
--- a/src/interfaces.ts
+++ b/src/interfaces.ts
@@ -1,69 +1,69 @@
-import { ResponseFn } from './sbFetch'
+import type { ResponseFn } from './sbFetch';
 
 export interface ISbStoriesParams
   extends Partial,
-    ISbMultipleStoriesData,
-    ISbAssetsParams {
-  resolve_level?: number
-  _stopResolving?: boolean
-  by_slugs?: string
-  by_uuids?: string
-  by_uuids_ordered?: string
-  component?: string
-  content_type?: string
-  cv?: number
-  datasource?: string
-  dimension?: string
-  excluding_fields?: string
-  excluding_ids?: string
-  excluding_slugs?: string
-  fallback_lang?: string
-  filename?: string
-  filter_query?: any
-  first_published_at_gt?: string
-  first_published_at_lt?: string
-  from_release?: string
-  is_startpage?: boolean
-  language?: string
-  level?: number
-  page?: number
-  per_page?: number
-  published_at_gt?: string
-  published_at_lt?: string
-  resolve_assets?: number
-  resolve_links?: 'link' | 'url' | 'story' | '0' | '1' | 'link'
-  resolve_links_level?: 1 | 2
-  resolve_relations?: string | string[]
-  search_term?: string
-  size?: string
-  sort_by?: string
-  starts_with?: string
-  token?: string
-  version?: 'draft' | 'published'
-  with_tag?: string
+  ISbMultipleStoriesData,
+  ISbAssetsParams {
+  resolve_level?: number;
+  _stopResolving?: boolean;
+  by_slugs?: string;
+  by_uuids?: string;
+  by_uuids_ordered?: string;
+  component?: string;
+  content_type?: string;
+  cv?: number;
+  datasource?: string;
+  dimension?: string;
+  excluding_fields?: string;
+  excluding_ids?: string;
+  excluding_slugs?: string;
+  fallback_lang?: string;
+  filename?: string;
+  filter_query?: any;
+  first_published_at_gt?: string;
+  first_published_at_lt?: string;
+  from_release?: string;
+  is_startpage?: boolean;
+  language?: string;
+  level?: number;
+  page?: number;
+  per_page?: number;
+  published_at_gt?: string;
+  published_at_lt?: string;
+  resolve_assets?: number;
+  resolve_links?: 'link' | 'url' | 'story' | '0' | '1' | 'link';
+  resolve_links_level?: 1 | 2;
+  resolve_relations?: string | string[];
+  search_term?: string;
+  size?: string;
+  sort_by?: string;
+  starts_with?: string;
+  token?: string;
+  version?: 'draft' | 'published';
+  with_tag?: string;
 }
 
 export interface ISbStoryParams {
-  resolve_level?: number
-  token?: string
-  find_by?: 'uuid'
-  version?: 'draft' | 'published'
-  resolve_links?: 'link' | 'url' | 'story' | '0' | '1'
-  resolve_links_level?: 1 | 2
-  resolve_relations?: string | string[]
-  cv?: number
-  from_release?: string
-  language?: string
-  fallback_lang?: string
+  resolve_level?: number;
+  token?: string;
+  find_by?: 'uuid';
+  version?: 'draft' | 'published';
+  resolve_links?: 'link' | 'url' | 'story' | '0' | '1';
+  resolve_links_level?: 1 | 2;
+  resolve_relations?: string | string[];
+  cv?: number;
+  from_release?: string;
+  language?: string;
+  fallback_lang?: string;
 }
 
-type Dimension = {
-  id: number
-  name: string
-  entry_value: string
-  datasource_id: number
-  created_at: string
-  updated_at: string
+interface Dimension {
+  id: number;
+  name: string;
+  entry_value: string;
+  datasource_id: number;
+  created_at: string;
+  updated_at: string;
 }
 
 /**
@@ -72,291 +72,291 @@ type Dimension = {
  * @description One use it to handle the API response
  */
 export interface ISbDimensions {
-  dimensions: Dimension[]
+  dimensions: Dimension[];
 }
 
 export interface ISbComponentType {
-  _uid?: string
-  component?: T
-  _editable?: string
+  _uid?: string;
+  component?: T;
+  _editable?: string;
 }
 
 export interface ISbStoryData<
   Content = ISbComponentType & { [index: string]: any },
 > extends ISbMultipleStoriesData {
-  alternates: ISbAlternateObject[]
-  breadcrumbs?: ISbLinkURLObject[]
-  content: Content
-  created_at: string
-  default_full_slug?: string
-  default_root?: string
-  disble_fe_editor?: boolean
-  first_published_at?: string
-  full_slug: string
-  group_id: string
-  id: number
-  imported_at?: string
-  is_folder?: boolean
-  is_startpage?: boolean
-  lang: string
+  alternates: ISbAlternateObject[];
+  breadcrumbs?: ISbLinkURLObject[];
+  content: Content;
+  created_at: string;
+  default_full_slug?: string;
+  default_root?: string;
+  disble_fe_editor?: boolean;
+  first_published_at?: string;
+  full_slug: string;
+  group_id: string;
+  id: number;
+  imported_at?: string;
+  is_folder?: boolean;
+  is_startpage?: boolean;
+  lang: string;
   last_author?: {
-    id: number
-    userid: string
-  }
-  meta_data: any
-  name: string
-  parent?: ISbStoryData
-  parent_id: number
-  path?: string
-  pinned?: '1' | boolean
-  position: number
-  published?: boolean
-  published_at: string | null
-  release_id?: number
-  slug: string
-  sort_by_date: string | null
-  tag_list: string[]
+    id: number;
+    userid: string;
+  };
+  meta_data: any;
+  name: string;
+  parent?: ISbStoryData;
+  parent_id: number;
+  path?: string;
+  pinned?: '1' | boolean;
+  position: number;
+  published?: boolean;
+  published_at: string | null;
+  release_id?: number;
+  slug: string;
+  sort_by_date: string | null;
+  tag_list: string[];
   translated_slugs?: {
-    path: string
-    name: string | null
-    lang: ISbStoryData['lang']
-  }[]
-  unpublished_changes?: boolean
-  updated_at?: string
-  uuid: string
+    path: string;
+    name: string | null;
+    lang: ISbStoryData['lang'];
+  }[];
+  unpublished_changes?: boolean;
+  updated_at?: string;
+  uuid: string;
 }
 
 export interface ISbMultipleStoriesData {
-  by_ids?: string
-  by_uuids?: string
-  contain_component?: string
-  excluding_ids?: string
-  filter_query?: any
-  folder_only?: boolean
-  full_slug?: string
-  in_release?: string
-  in_trash?: boolean
-  is_published?: boolean
-  in_workflow_stages?: string
-  page?: number
-  pinned?: '1' | boolean
-  search?: string
-  sort_by?: string
-  starts_with?: string
-  story_only?: boolean
-  text_search?: string
-  with_parent?: number
-  with_slug?: string
-  with_tag?: string
+  by_ids?: string;
+  by_uuids?: string;
+  contain_component?: string;
+  excluding_ids?: string;
+  filter_query?: any;
+  folder_only?: boolean;
+  full_slug?: string;
+  in_release?: string;
+  in_trash?: boolean;
+  is_published?: boolean;
+  in_workflow_stages?: string;
+  page?: number;
+  pinned?: '1' | boolean;
+  search?: string;
+  sort_by?: string;
+  starts_with?: string;
+  story_only?: boolean;
+  text_search?: string;
+  with_parent?: number;
+  with_slug?: string;
+  with_tag?: string;
 }
 
 export interface ISbAlternateObject {
-  id: number
-  name: string
-  slug: string
-  published: boolean
-  full_slug: string
-  is_folder: boolean
-  parent_id: number
+  id: number;
+  name: string;
+  slug: string;
+  published: boolean;
+  full_slug: string;
+  is_folder: boolean;
+  parent_id: number;
 }
 
 export interface ISbLinkURLObject {
-  id: number
-  name: string
-  slug: string
-  full_slug: string
-  url: string
-  uuid: string
+  id: number;
+  name: string;
+  slug: string;
+  full_slug: string;
+  url: string;
+  uuid: string;
 }
 
 export interface ISbStories<
   Content = ISbComponentType & { [index: string]: any },
 > {
   data: {
-    cv: number
-    links: (ISbStoryData | ISbLinkURLObject)[]
-    rels: ISbStoryData[]
-    stories: ISbStoryData[]
-  }
-  perPage: number
-  total: number
-  headers: any
+    cv: number;
+    links: (ISbStoryData | ISbLinkURLObject)[];
+    rels: ISbStoryData[];
+    stories: ISbStoryData[];
+  };
+  perPage: number;
+  total: number;
+  headers: any;
 }
 
 export interface ISbStory<
   Content = ISbComponentType & { [index: string]: any },
 > {
   data: {
-    cv: number
-    links: (ISbStoryData | ISbLinkURLObject)[]
-    rels: ISbStoryData[]
-    story: ISbStoryData
-  }
-  headers: any
+    cv: number;
+    links: (ISbStoryData | ISbLinkURLObject)[];
+    rels: ISbStoryData[];
+    story: ISbStoryData;
+  };
+  headers: any;
 }
 
 export interface IMemoryType extends ISbResult {
-  [key: string]: any
+  [key: string]: any;
 }
 
 export interface ICacheProvider {
-  get: (key: string) => Promise
-  set: (key: string, content: ISbResult) => Promise
-  getAll: () => Promise
-  flush: () => Promise
+  get: (key: string) => Promise;
+  set: (key: string, content: ISbResult) => Promise;
+  getAll: () => Promise;
+  flush: () => Promise;
 }
 
 export interface ISbCache {
-  type?: 'none' | 'memory' | 'custom'
-  clear?: 'auto' | 'manual'
-  custom?: ICacheProvider
+  type?: 'none' | 'memory' | 'custom';
+  clear?: 'auto' | 'manual';
+  custom?: ICacheProvider;
 }
 
 export interface ISbConfig {
-  accessToken?: string
-  oauthToken?: string
-  resolveNestedRelations?: boolean
-  cache?: ISbCache
-  responseInterceptor?: ResponseFn
-  fetch?: typeof fetch
-  timeout?: number
-  headers?: any
-  region?: string
-  maxRetries?: number
-  https?: boolean
-  rateLimit?: number
-  componentResolver?: (component: string, data: any) => void
-  richTextSchema?: ISbSchema
-  endpoint?: string
+  accessToken?: string;
+  oauthToken?: string;
+  resolveNestedRelations?: boolean;
+  cache?: ISbCache;
+  responseInterceptor?: ResponseFn;
+  fetch?: typeof fetch;
+  timeout?: number;
+  headers?: any;
+  region?: string;
+  maxRetries?: number;
+  https?: boolean;
+  rateLimit?: number;
+  componentResolver?: (component: string, data: any) => void;
+  richTextSchema?: ISbSchema;
+  endpoint?: string;
 }
 
 export interface ISbResult {
-  data: any
-  perPage: number
-  total: number
-  headers: Headers
+  data: any;
+  perPage: number;
+  total: number;
+  headers: Headers;
 }
 
 export interface ISbResponse {
-  data: any
-  status: number
-  statusText: string
+  data: any;
+  status: number;
+  statusText: string;
 }
 
 export interface ISbError {
-  message?: string
-  status?: number
-  response?: ISbResponse
+  message?: string;
+  status?: number;
+  response?: ISbResponse;
 }
 
 export interface ISbNode extends Element {
-  content: object[]
+  content: object[];
   attrs: {
-    anchor?: string
-    body?: Array>
-    href?: string
-    level?: number
-    linktype?: string
-    custom?: LinkCustomAttributes
-    [key: string]: any | undefined
-  }
+    anchor?: string;
+    body?: Array>;
+    href?: string;
+    level?: number;
+    linktype?: string;
+    custom?: LinkCustomAttributes;
+    [key: string]: any | undefined;
+  };
 }
 
-export type NodeSchema = {
-  (node: ISbNode): object
+export interface NodeSchema {
+  (node: ISbNode): object;
 }
 
-export type MarkSchema = {
-  (node: ISbNode): object
+export interface MarkSchema {
+  (node: ISbNode): object;
 }
 
 export interface ISbContentMangmntAPI<
   Content = ISbComponentType & { [index: string]: any },
 > {
   story: {
-    name: string
-    slug: string
-    content?: Content
-    default_root?: boolean
-    is_folder?: boolean
-    parent_id?: string
-    disble_fe_editor?: boolean
-    path?: string
-    is_startpage?: boolean
-    position?: number
-    first_published_at?: string
+    name: string;
+    slug: string;
+    content?: Content;
+    default_root?: boolean;
+    is_folder?: boolean;
+    parent_id?: string;
+    disble_fe_editor?: boolean;
+    path?: string;
+    is_startpage?: boolean;
+    position?: number;
+    first_published_at?: string;
     translated_slugs_attributes?: {
-      path: string
-      name: string | null
-      lang: ISbContentMangmntAPI['lang']
-    }[]
-  }
-  force_update?: '1' | unknown
-  release_id?: number
-  publish?: '1' | unknown
-  lang?: string
+      path: string;
+      name: string | null;
+      lang: ISbContentMangmntAPI['lang'];
+    }[];
+  };
+  force_update?: '1' | unknown;
+  release_id?: number;
+  publish?: '1' | unknown;
+  lang?: string;
 }
 
 export interface ISbManagmentApiResult {
-  data: any
-  headers: any
+  data: any;
+  headers: any;
 }
 
 export interface ISbSchema {
-  nodes: any
-  marks: any
+  nodes: any;
+  marks: any;
 }
 
 export interface ISbRichtext {
-  content?: ISbRichtext[]
-  marks?: ISbRichtext[]
-  attrs?: any
-  text?: string
-  type: string
+  content?: ISbRichtext[];
+  marks?: ISbRichtext[];
+  attrs?: any;
+  text?: string;
+  type: string;
 }
 
 export interface LinkCustomAttributes {
-  rel?: string
-  title?: string
-  [key: string]: any
+  rel?: string;
+  title?: string;
+  [key: string]: any;
 }
 
 export interface ISbLink {
-  id?: number
-  slug?: string
-  name?: string
-  is_folder?: boolean
-  parent_id?: number
-  published?: boolean
-  position?: number
-  uuid?: string
-  is_startpage?: boolean
+  id?: number;
+  slug?: string;
+  name?: string;
+  is_folder?: boolean;
+  parent_id?: number;
+  published?: boolean;
+  position?: number;
+  uuid?: string;
+  is_startpage?: boolean;
 }
 
 export interface ISbLinks {
   links?: {
-    [key: string]: ISbLink
-  }
+    [key: string]: ISbLink;
+  };
 }
 
-export type ThrottleFn = {
-  (...args: any): any
+export interface ThrottleFn {
+  (...args: any): any;
 }
 
-export type AsyncFn = (...args: any) => [] | Promise
+export type AsyncFn = (...args: any) => [] | Promise;
 
-export type ArrayFn = (...args: any) => void
+export type ArrayFn = (...args: any) => void;
 
-export type HtmlEscapes = {
-  [key: string]: string
+export interface HtmlEscapes {
+  [key: string]: string;
 }
 
 export interface ISbCustomFetch extends Omit {}
 
 export interface ISbAssetsParams {
-  in_folder?: string
-  is_private?: boolean
-  by_alt?: string
-  by_copyright?: string
-  by_title?: string
+  in_folder?: string;
+  is_private?: boolean;
+  by_alt?: string;
+  by_copyright?: string;
+  by_title?: string;
 }
diff --git a/src/richTextResolver.ts b/src/richTextResolver.ts
index e3eb226c..8864f554 100644
--- a/src/richTextResolver.ts
+++ b/src/richTextResolver.ts
@@ -1,32 +1,32 @@
-import defaultHtmlSerializer from './schema'
-import { ISbSchema, ISbRichtext } from './interfaces'
+import defaultHtmlSerializer from './schema';
+import type { ISbRichtext, ISbSchema } from './interfaces';
 
-type HtmlEscapes = {
-  [key: string]: string
+interface HtmlEscapes {
+  [key: string]: string;
 }
 
 type OptimizeImagesOptions =
   | boolean
   | {
-      class?: string
-      filters?: {
-        blur?: number
-        brightness?: number
-        fill?: string
-        format?: 'webp' | 'jpeg' | 'png'
-        grayscale?: boolean
-        quality?: number
-        rotate?: 90 | 180 | 270
-      }
-      height?: number
-      loading?: 'lazy' | 'eager'
-      sizes?: string[]
-      srcset?: (number | [number, number])[]
-      width?: number
-    }
-
-type RenderOptions = {
-  optimizeImages?: OptimizeImagesOptions
+    class?: string;
+    filters?: {
+      blur?: number;
+      brightness?: number;
+      fill?: string;
+      format?: 'webp' | 'jpeg' | 'png';
+      grayscale?: boolean;
+      quality?: number;
+      rotate?: 90 | 180 | 270;
+    };
+    height?: number;
+    loading?: 'lazy' | 'eager';
+    sizes?: string[];
+    srcset?: (number | [number, number])[];
+    width?: number;
+  };
+
+interface RenderOptions {
+  optimizeImages?: OptimizeImagesOptions;
 }
 
 const escapeHTML = function (string: string) {
@@ -35,280 +35,292 @@ const escapeHTML = function (string: string) {
     '<': '<',
     '>': '>',
     '"': '"',
-    "'": ''',
-  } as HtmlEscapes
+    '\'': ''',
+  } as HtmlEscapes;
 
-  const reUnescapedHtml = /[&<>"']/g
-  const reHasUnescapedHtml = RegExp(reUnescapedHtml.source)
+  const reUnescapedHtml = /[&<>"']/g;
+  const reHasUnescapedHtml = new RegExp(reUnescapedHtml.source);
 
   return string && reHasUnescapedHtml.test(string)
-    ? string.replace(reUnescapedHtml, (chr) => htmlEscapes[chr])
-    : string
-}
+    ? string.replace(reUnescapedHtml, chr => htmlEscapes[chr])
+    : string;
+};
 
 interface ISbTag extends Element {
-  [key: string]: any
+  [key: string]: any;
 }
 
 interface ISbNode {
-  [key: string]: ISbSchema | ((arg: ISbRichtext) => any)
+  [key: string]: ISbSchema | ((arg: ISbRichtext) => any);
 }
 
 interface ISbFunction {
-  (...args: T): R
+  (...args: T): R;
 }
 
-let hasWarnedAboutDeprecation = false; 
+let hasWarnedAboutDeprecation = false;
 
 class RichTextResolver {
-  private marks: ISbNode
-  private nodes: ISbNode
+  private marks: ISbNode;
+  private nodes: ISbNode;
 
   public constructor(schema?: ISbSchema) {
     if (!schema) {
-      schema = defaultHtmlSerializer as ISbSchema
+      schema = defaultHtmlSerializer as ISbSchema;
     }
 
-    this.marks = schema.marks || []
-    this.nodes = schema.nodes || []
+    this.marks = schema.marks || [];
+    this.nodes = schema.nodes || [];
   }
 
   public addNode(key: string, schema: ISbSchema | ISbFunction) {
-    this.nodes[key] = schema
+    this.nodes[key] = schema;
   }
 
   public addMark(key: string, schema: ISbSchema) {
-    this.marks[key] = schema
+    this.marks[key] = schema;
   }
 
   public render(
     data?: ISbRichtext,
     options: RenderOptions = { optimizeImages: false },
-    deprecationWarning = true
+    deprecationWarning = true,
   ) {
-    if(!hasWarnedAboutDeprecation && deprecationWarning) {
+    if (!hasWarnedAboutDeprecation && deprecationWarning) {
       console.warn(
-        "Warning ⚠️: The RichTextResolver class is deprecated and will be removed in the next major release. Please use the `@storyblok/richtext` package instead. https://github.com/storyblok/richtext/"
+        'Warning ⚠️: The RichTextResolver class is deprecated and will be removed in the next major release. Please use the `@storyblok/richtext` package instead. https://github.com/storyblok/richtext/',
       );
-      hasWarnedAboutDeprecation = true
+      hasWarnedAboutDeprecation = true;
     }
     if (data && data.content && Array.isArray(data.content)) {
-      let html = ''
+      let html = '';
 
       data.content.forEach((node) => {
-        html += this.renderNode(node)
-      })
+        html += this.renderNode(node);
+      });
 
       if (options.optimizeImages) {
-        return this.optimizeImages(html, options.optimizeImages)
+        return this.optimizeImages(html, options.optimizeImages);
       }
 
-      return html
+      return html;
     }
 
     console.warn(
       `The render method must receive an Object with a "content" field.
-			The "content" field must be an array of nodes as the type ISbRichtext.
-			ISbRichtext:
-				content?: ISbRichtext[]
-				marks?: ISbRichtext[]
-				attrs?: any
-				text?: string
-				type: string
-				
-				Example:
-				{
-					content: [
-						{
-							content: [
-								{
-									text: 'Hello World',
-									type: 'text'
-								}
-							],
-							type: 'paragraph'
-						}
-					],
-					type: 'doc'
-				}`
-    )
-    return ''
+      The "content" field must be an array of nodes as the type ISbRichtext.
+      ISbRichtext:
+        content?: ISbRichtext[]
+        marks?: ISbRichtext[]
+        attrs?: any
+        text?: string
+        type: string
+        
+        Example:
+        {
+          content: [
+            {
+              content: [
+                {
+                  text: 'Hello World',
+                  type: 'text'
+                }
+              ],
+              type: 'paragraph'
+            }
+          ],
+          type: 'doc'
+        }`,
+    );
+    return '';
   }
 
   private optimizeImages(html: string, options: OptimizeImagesOptions): string {
-    let w = 0
-    let h = 0
-    let imageAttributes = ''
-    let filters = ''
+    let w = 0;
+    let h = 0;
+    let imageAttributes = '';
+    let filters = '';
 
     if (typeof options !== 'boolean') {
       if (typeof options.width === 'number' && options.width > 0) {
-        imageAttributes += `width="${options.width}" `
-        w = options.width
+        imageAttributes += `width="${options.width}" `;
+        w = options.width;
       }
 
       if (typeof options.height === 'number' && options.height > 0) {
-        imageAttributes += `height="${options.height}" `
-        h = options.height
+        imageAttributes += `height="${options.height}" `;
+        h = options.height;
       }
 
       if (options.loading === 'lazy' || options.loading === 'eager') {
-        imageAttributes += `loading="${options.loading}" `
+        imageAttributes += `loading="${options.loading}" `;
       }
 
       if (typeof options.class === 'string' && options.class.length > 0) {
-        imageAttributes += `class="${options.class}" `
+        imageAttributes += `class="${options.class}" `;
       }
 
       if (options.filters) {
         if (
-          typeof options.filters.blur === 'number' &&
-          options.filters.blur >= 0 &&
-          options.filters.blur <= 100
+          typeof options.filters.blur === 'number'
+          && options.filters.blur >= 0
+          && options.filters.blur <= 100
         ) {
-          filters += `:blur(${options.filters.blur})`
+          filters += `:blur(${options.filters.blur})`;
         }
 
         if (
-          typeof options.filters.brightness === 'number' &&
-          options.filters.brightness >= -100 &&
-          options.filters.brightness <= 100
+          typeof options.filters.brightness === 'number'
+          && options.filters.brightness >= -100
+          && options.filters.brightness <= 100
         ) {
-          filters += `:brightness(${options.filters.brightness})`
+          filters += `:brightness(${options.filters.brightness})`;
         }
 
         if (
-          options.filters.fill &&
-          (options.filters.fill.match(/[0-9A-Fa-f]{6}/g) ||
-            options.filters.fill === 'transparent')
+          options.filters.fill
+          && (options.filters.fill.match(/[0-9A-F]{6}/gi)
+            || options.filters.fill === 'transparent')
         ) {
-          filters += `:fill(${options.filters.fill})`
+          filters += `:fill(${options.filters.fill})`;
         }
 
         if (
-          options.filters.format &&
-          ['webp', 'png', 'jpeg'].includes(options.filters.format)
+          options.filters.format
+          && ['webp', 'png', 'jpeg'].includes(options.filters.format)
         ) {
-          filters += `:format(${options.filters.format})`
+          filters += `:format(${options.filters.format})`;
         }
 
         if (
-          typeof options.filters.grayscale === 'boolean' &&
-          options.filters.grayscale
+          typeof options.filters.grayscale === 'boolean'
+          && options.filters.grayscale
         ) {
-          filters += ':grayscale()'
+          filters += ':grayscale()';
         }
 
         if (
-          typeof options.filters.quality === 'number' &&
-          options.filters.quality >= 0 &&
-          options.filters.quality <= 100
+          typeof options.filters.quality === 'number'
+          && options.filters.quality >= 0
+          && options.filters.quality <= 100
         ) {
-          filters += `:quality(${options.filters.quality})`
+          filters += `:quality(${options.filters.quality})`;
         }
 
         if (
-          options.filters.rotate &&
-          [90, 180, 270].includes(options.filters.rotate)
+          options.filters.rotate
+          && [90, 180, 270].includes(options.filters.rotate)
         ) {
-          filters += `:rotate(${options.filters.rotate})`
+          filters += `:rotate(${options.filters.rotate})`;
         }
 
-        if (filters.length > 0) filters = '/filters' + filters
+        if (filters.length > 0) {
+          filters = `/filters${filters}`;
+        }
       }
     }
 
     if (imageAttributes.length > 0) {
-      html = html.replace(/ 0 || h > 0 || filters.length > 0 ? `${w}x${h}${filters}` : ''
+    const parameters
+      = w > 0 || h > 0 || filters.length > 0 ? `${w}x${h}${filters}` : '';
 
     html = html.replace(
-      /a.storyblok.com\/f\/(\d+)\/([^.]+)\.(gif|jpg|jpeg|png|tif|tiff|bmp)/g,
-      `a.storyblok.com/f/$1/$2.$3/m/${parameters}`
-    )
+      /a.storyblok.com\/f\/(\d+)\/([^.]+)\.(gif|jpg|jpeg|png|tif|bmp)/g,
+      `a.storyblok.com/f/$1/$2.$3/m/${parameters}`,
+    );
 
     if (typeof options !== 'boolean' && (options.sizes || options.srcset)) {
       html = html.replace(/ {
         const url = value.match(
-          /a.storyblok.com\/f\/(\d+)\/([^.]+)\.(gif|jpg|jpeg|png|tif|tiff|bmp)/g
-        )
+          /a.storyblok.com\/f\/(\d+)\/([^.]+)\.(gif|jpg|jpeg|png|tif|bmp)/g,
+        );
 
         if (url && url.length > 0) {
           const imageAttributes = {
             srcset: options.srcset
               ?.map((value) => {
                 if (typeof value === 'number') {
-                  return `//${url}/m/${value}x0${filters} ${value}w`
+                  return `//${url}/m/${value}x0${filters} ${value}w`;
                 }
 
                 if (typeof value === 'object' && value.length === 2) {
-                  let w = 0
-                  let h = 0
-                  if (typeof value[0] === 'number') w = value[0]
-                  if (typeof value[1] === 'number') h = value[1]
-                  return `//${url}/m/${w}x${h}${filters} ${w}w`
+                  let w = 0;
+                  let h = 0;
+                  if (typeof value[0] === 'number') {
+                    w = value[0];
+                  }
+                  if (typeof value[1] === 'number') {
+                    h = value[1];
+                  }
+                  return `//${url}/m/${w}x${h}${filters} ${w}w`;
                 }
+
+                return '';
               })
               .join(', '),
-            sizes: options.sizes?.map((size) => size).join(', '),
-          }
+            sizes: options.sizes?.map(size => size).join(', '),
+          };
 
-          let renderImageAttributes = ''
+          let renderImageAttributes = '';
           if (imageAttributes.srcset) {
-            renderImageAttributes += `srcset="${imageAttributes.srcset}" `
+            renderImageAttributes += `srcset="${imageAttributes.srcset}" `;
           }
           if (imageAttributes.sizes) {
-            renderImageAttributes += `sizes="${imageAttributes.sizes}" `
+            renderImageAttributes += `sizes="${imageAttributes.sizes}" `;
           }
 
-          return value.replace(/ {
-        const mark = this.getMatchingMark(m)
+        const mark = this.getMatchingMark(m);
 
         if (mark && mark.tag !== '') {
-          html.push(this.renderOpeningTag(mark.tag))
+          html.push(this.renderOpeningTag(mark.tag));
         }
-      })
+      });
     }
 
-    const node = this.getMatchingNode(item)
+    const node = this.getMatchingNode(item);
 
     if (node && node.tag) {
-      html.push(this.renderOpeningTag(node.tag))
+      html.push(this.renderOpeningTag(node.tag));
     }
 
     if (item.content) {
       item.content.forEach((content) => {
-        html.push(this.renderNode(content))
-      })
-    } else if (item.text) {
-      html.push(escapeHTML(item.text))
-    } else if (node && node.singleTag) {
-      html.push(this.renderTag(node.singleTag, ' /'))
-    } else if (node && node.html) {
-      html.push(node.html)
-    } else if (item.type === 'emoji') {
-      html.push(this.renderEmoji(item))
+        html.push(this.renderNode(content));
+      });
+    }
+    else if (item.text) {
+      html.push(escapeHTML(item.text));
+    }
+    else if (node && node.singleTag) {
+      html.push(this.renderTag(node.singleTag, ' /'));
+    }
+    else if (node && node.html) {
+      html.push(node.html);
+    }
+    else if (item.type === 'emoji') {
+      html.push(this.renderEmoji(item));
     }
 
     if (node && node.tag) {
-      html.push(this.renderClosingTag(node.tag))
+      html.push(this.renderClosingTag(node.tag));
     }
 
     if (item.marks) {
@@ -316,51 +328,52 @@ class RichTextResolver {
         .slice(0)
         .reverse()
         .forEach((m) => {
-          const mark = this.getMatchingMark(m)
+          const mark = this.getMatchingMark(m);
 
           if (mark && mark.tag !== '') {
-            html.push(this.renderClosingTag(mark.tag))
+            html.push(this.renderClosingTag(mark.tag));
           }
-        })
+        });
     }
 
-    return html.join('')
+    return html.join('');
   }
 
   private renderTag(tags: ISbTag[], ending: string) {
     if (tags.constructor === String) {
-      return `<${tags}${ending}>`
+      return `<${tags}${ending}>`;
     }
 
     const all = tags.map((tag) => {
       if (tag.constructor === String) {
-        return `<${tag}${ending}>`
-      } else {
-        let h = `<${tag.tag}`
+        return `<${tag}${ending}>`;
+      }
+      else {
+        let h = `<${tag.tag}`;
         if (tag.attrs) {
           for (const key in tag.attrs) {
             if (Object.prototype.hasOwnProperty.call(tag.attrs, key)) {
-              const value = tag.attrs[key]
+              const value = tag.attrs[key];
               if (value !== null) {
-                h += ` ${key}="${value}"`
+                h += ` ${key}="${value}"`;
               }
             }
           }
         }
 
-        return `${h}${ending}>`
+        return `${h}${ending}>`;
       }
-    })
-    return all.join('')
+    });
+    return all.join('');
   }
 
   private renderOpeningTag(tags: ISbTag[]) {
-    return this.renderTag(tags, '')
+    return this.renderTag(tags, '');
   }
 
   private renderClosingTag(tags: ISbTag[]) {
     if (tags.constructor === String) {
-      return ``
+      return ``;
     }
 
     const all = tags
@@ -368,32 +381,33 @@ class RichTextResolver {
       .reverse()
       .map((tag) => {
         if (tag.constructor === String) {
-          return ``
-        } else {
-          return ``
+          return ``;
+        }
+        else {
+          return ``;
         }
-      })
+      });
 
-    return all.join('')
+    return all.join('');
   }
 
   private getMatchingNode(item: ISbRichtext) {
-    const node = this.nodes[item.type]
+    const node = this.nodes[item.type];
     if (typeof node === 'function') {
-      return node(item)
+      return node(item);
     }
   }
 
   private getMatchingMark(item: ISbRichtext) {
-    const node = this.marks[item.type]
+    const node = this.marks[item.type];
     if (typeof node === 'function') {
-      return node(item)
+      return node(item);
     }
   }
 
   private renderEmoji(item: ISbRichtext) {
     if (item.attrs.emoji) {
-      return item.attrs.emoji
+      return item.attrs.emoji;
     }
 
     const emojiImageContainer = [
@@ -406,10 +420,10 @@ class RichTextResolver {
           align: 'absmiddle',
         },
       },
-    ] as unknown as ISbTag[]
+    ] as unknown as ISbTag[];
 
-    return this.renderTag(emojiImageContainer, ' /')
+    return this.renderTag(emojiImageContainer, ' /');
   }
 }
 
-export default RichTextResolver
+export default RichTextResolver;
diff --git a/src/sbFetch.test.ts b/src/sbFetch.test.ts
index 2841fe07..59ff36d4 100644
--- a/src/sbFetch.test.ts
+++ b/src/sbFetch.test.ts
@@ -1,51 +1,52 @@
-import { describe, it, expect, vi, afterEach } from 'vitest'
-import SbFetch, { ISbFetch } from './sbFetch'
-import { headersToObject } from '../tests/utils'
+import { afterEach, describe, expect, it, vi } from 'vitest';
+import type { ISbFetch } from './sbFetch';
+import SbFetch from './sbFetch';
+import { headersToObject } from '../tests/utils';
 
-describe('SbFetch', () => {
-  let sbFetch: SbFetch
-  const mockFetch = vi.fn()
+describe('sbFetch', () => {
+  let sbFetch: SbFetch;
+  const mockFetch = vi.fn();
 
   afterEach(() => {
-    vi.restoreAllMocks()
-  })
+    vi.restoreAllMocks();
+  });
 
   it('should initialize', () => {
-    sbFetch = new SbFetch({} as ISbFetch)
-    expect(sbFetch).toBeInstanceOf(SbFetch)
-  })
+    sbFetch = new SbFetch({} as ISbFetch);
+    expect(sbFetch).toBeInstanceOf(SbFetch);
+  });
 
   describe('get', () => {
     it('should correctly construct URLs for GET requests', async () => {
       sbFetch = new SbFetch({
         baseURL: 'https://api.storyblok.com/v2/',
         fetch: mockFetch,
-      } as ISbFetch)
+      } as ISbFetch);
       const response = new Response(JSON.stringify({ data: 'test' }), {
         status: 200,
         headers: { 'Content-Type': 'application/json' },
-      })
-      mockFetch.mockResolvedValue(response)
+      });
+      mockFetch.mockResolvedValue(response);
       await sbFetch.get('test', {
         is_startpage: false,
         search_term: 'test',
-      })
+      });
       expect(mockFetch).toHaveBeenCalledWith(
         'https://api.storyblok.com/v2/test?is_startpage=false&search_term=test',
-        expect.anything()
-      )
-    })
-  })
+        expect.anything(),
+      );
+    });
+  });
 
   describe('post', () => {
     it('should handle POST requests correctly', async () => {
-      const testPayload = { title: 'New Story' }
+      const testPayload = { title: 'New Story' };
       const response = new Response(JSON.stringify({ data: 'test' }), {
         status: 200,
         headers: { 'Content-Type': 'application/json' },
-      })
-      mockFetch.mockResolvedValue(response)
-      await sbFetch.post('stories', testPayload)
+      });
+      mockFetch.mockResolvedValue(response);
+      await sbFetch.post('stories', testPayload);
       expect(mockFetch).toHaveBeenCalledWith(
         'https://api.storyblok.com/v2/stories',
         {
@@ -53,9 +54,9 @@ describe('SbFetch', () => {
           body: JSON.stringify(testPayload),
           headers: expect.any(Headers),
           signal: expect.any(AbortSignal),
-        }
-      )
-    })
+        },
+      );
+    });
 
     it('should set specific headers for POST requests', async () => {
       sbFetch = new SbFetch({
@@ -64,32 +65,32 @@ describe('SbFetch', () => {
           'Content-Type': 'application/json',
         }),
         fetch: mockFetch,
-      } as ISbFetch)
-      const testPayload = { title: 'New Story' }
+      } as ISbFetch);
+      const testPayload = { title: 'New Story' };
       const response = new Response(JSON.stringify({ data: 'test' }), {
         status: 200,
         headers: { 'Content-Type': 'application/json' },
-      })
-      mockFetch.mockResolvedValue(response)
+      });
+      mockFetch.mockResolvedValue(response);
 
-      await sbFetch.post('stories', testPayload)
+      await sbFetch.post('stories', testPayload);
 
       // Get the last call to fetch and extract the headers
-      const lastCall = mockFetch.mock.calls[mockFetch.mock.calls.length - 1]
-      const actualHeaders = headersToObject(lastCall[1].headers)
-      expect(actualHeaders['content-type']).toBe('application/json')
-    })
-  })
+      const lastCall = mockFetch.mock.calls[mockFetch.mock.calls.length - 1];
+      const actualHeaders = headersToObject(lastCall[1].headers);
+      expect(actualHeaders['content-type']).toBe('application/json');
+    });
+  });
 
   describe('put', () => {
     it('should handle PUT requests correctly', async () => {
-      const testPayload = { title: 'Updated Story' }
+      const testPayload = { title: 'Updated Story' };
       const response = new Response(JSON.stringify({ data: 'test' }), {
         status: 200,
         headers: { 'Content-Type': 'application/json' },
-      })
-      mockFetch.mockResolvedValue(response)
-      await sbFetch.put('stories/1', testPayload)
+      });
+      mockFetch.mockResolvedValue(response);
+      await sbFetch.put('stories/1', testPayload);
       expect(mockFetch).toHaveBeenCalledWith(
         'https://api.storyblok.com/v2/stories/1',
         {
@@ -97,18 +98,18 @@ describe('SbFetch', () => {
           body: JSON.stringify(testPayload),
           headers: expect.any(Headers),
           signal: expect.any(AbortSignal),
-        }
-      )
-    })
-  })
+        },
+      );
+    });
+  });
 
   describe('delete', () => {
     it('should handle DELETE requests correctly', async () => {
       const response = new Response(null, {
         status: 204, // Typically, DELETE operations might not return content
-      })
-      mockFetch.mockResolvedValue(response)
-      await sbFetch.delete('stories/1', {})
+      });
+      mockFetch.mockResolvedValue(response);
+      await sbFetch.delete('stories/1', {});
       expect(mockFetch).toHaveBeenCalledWith(
         'https://api.storyblok.com/v2/stories/1',
         {
@@ -116,28 +117,28 @@ describe('SbFetch', () => {
           body: '{}', // Ensuring no body is sent
           headers: expect.any(Headers),
           signal: expect.any(AbortSignal),
-        }
-      )
-    })
-  })
+        },
+      );
+    });
+  });
 
   it('should handle network errors gracefully', async () => {
-    const mockFetch = vi.fn().mockRejectedValue(new Error('Network Failure'))
+    const mockFetch = vi.fn().mockRejectedValue(new Error('Network Failure'));
     const sbFetch = new SbFetch({
       baseURL: 'https://api.example.com',
       headers: new Headers(),
       fetch: mockFetch,
-    })
+    });
 
     // Assuming your implementation wraps the error message inside an object under `message`.
-    const result = await sbFetch.get('/test', {})
+    const result = await sbFetch.get('/test', {});
 
     // Check if the error object format matches your implementation.
     expect(result).toEqual({
       message: expect.any(Error), // Checks if `message` is an instance of Error
-    })
+    });
 
     // If you want to be more specific and check the message of the error:
-    expect(result.message.message).toEqual('Network Failure') // This path needs to match the structure you actually use.
-  })
-})
+    expect(result.message.message).toEqual('Network Failure'); // This path needs to match the structure you actually use.
+  });
+});
diff --git a/src/sbFetch.ts b/src/sbFetch.ts
index fbc30652..b5a9152b 100644
--- a/src/sbFetch.ts
+++ b/src/sbFetch.ts
@@ -1,47 +1,47 @@
-import { SbHelpers } from './sbHelpers'
+import { SbHelpers } from './sbHelpers';
 
-import {
-  ISbResponse,
+import type {
+  ISbCustomFetch,
   ISbError,
+  ISbResponse,
   ISbStoriesParams,
-  ISbCustomFetch,
-} from './interfaces'
-import Method from './constants'
+} from './interfaces';
+import type Method from './constants';
 
-export type ResponseFn = {
-  (arg?: ISbResponse | any): any
+export interface ResponseFn {
+  (arg?: ISbResponse | any): any;
 }
 
 export interface ISbFetch {
-  baseURL: string
-  timeout?: number
-  headers: Headers
-  responseInterceptor?: ResponseFn
-  fetch?: typeof fetch
+  baseURL: string;
+  timeout?: number;
+  headers: Headers;
+  responseInterceptor?: ResponseFn;
+  fetch?: typeof fetch;
 }
 
 class SbFetch {
-  private baseURL: string
-  private timeout?: number
-  private headers: Headers
-  private responseInterceptor?: ResponseFn
-  private fetch: typeof fetch
-  private ejectInterceptor?: boolean
-  private url: string
-  private parameters: ISbStoriesParams
-  private fetchOptions: ISbCustomFetch
+  private baseURL: string;
+  private timeout?: number;
+  private headers: Headers;
+  private responseInterceptor?: ResponseFn;
+  private fetch: typeof fetch;
+  private ejectInterceptor?: boolean;
+  private url: string;
+  private parameters: ISbStoriesParams;
+  private fetchOptions: ISbCustomFetch;
 
   public constructor($c: ISbFetch) {
-    this.baseURL = $c.baseURL
-    this.headers = $c.headers || new Headers()
-    this.timeout = $c?.timeout ? $c.timeout * 1000 : 0
-    this.responseInterceptor = $c.responseInterceptor
+    this.baseURL = $c.baseURL;
+    this.headers = $c.headers || new Headers();
+    this.timeout = $c?.timeout ? $c.timeout * 1000 : 0;
+    this.responseInterceptor = $c.responseInterceptor;
     this.fetch = (...args: [any]) =>
-      $c.fetch ? $c.fetch(...args) : fetch(...args)
-    this.ejectInterceptor = false
-    this.url = ''
-    this.parameters = {} as ISbStoriesParams
-    this.fetchOptions = {}
+      $c.fetch ? $c.fetch(...args) : fetch(...args);
+    this.ejectInterceptor = false;
+    this.url = '';
+    this.parameters = {} as ISbStoriesParams;
+    this.fetchOptions = {};
   }
 
   /**
@@ -51,80 +51,81 @@ class SbFetch {
    * @returns Promise
    */
   public get(url: string, params: ISbStoriesParams) {
-    this.url = url
-    this.parameters = params
-    return this._methodHandler('get')
+    this.url = url;
+    this.parameters = params;
+    return this._methodHandler('get');
   }
 
   public post(url: string, params: ISbStoriesParams) {
-    this.url = url
-    this.parameters = params
-    return this._methodHandler('post')
+    this.url = url;
+    this.parameters = params;
+    return this._methodHandler('post');
   }
 
   public put(url: string, params: ISbStoriesParams) {
-    this.url = url
-    this.parameters = params
-    return this._methodHandler('put')
+    this.url = url;
+    this.parameters = params;
+    return this._methodHandler('put');
   }
 
   public delete(url: string, params: ISbStoriesParams) {
-    this.url = url
-    this.parameters = params
-    return this._methodHandler('delete')
+    this.url = url;
+    this.parameters = params;
+    return this._methodHandler('delete');
   }
 
   private async _responseHandler(res: Response) {
-    const headers: string[] = []
+    const headers: string[] = [];
     const response = {
       data: {},
       headers: {},
       status: 0,
       statusText: '',
-    }
+    };
 
     if (res.status !== 204) {
       await res.json().then(($r) => {
-        response.data = $r
-      })
+        response.data = $r;
+      });
     }
 
     for (const pair of res.headers.entries()) {
-      headers[pair[0] as any] = pair[1]
+      headers[pair[0] as any] = pair[1];
     }
 
-    response.headers = { ...headers }
-    response.status = res.status
-    response.statusText = res.statusText
+    response.headers = { ...headers };
+    response.status = res.status;
+    response.statusText = res.statusText;
 
-    return response
+    return response;
   }
 
   private async _methodHandler(
-    method: Method
+    method: Method,
   ): Promise {
-    let urlString = `${this.baseURL}${this.url}`
+    let urlString = `${this.baseURL}${this.url}`;
 
-    let body = null
+    let body = null;
 
     if (method === 'get') {
-      const helper = new SbHelpers()
+      const helper = new SbHelpers();
       urlString = `${this.baseURL}${this.url}?${helper.stringify(
-        this.parameters
-      )}`
-    } else {
-      body = JSON.stringify(this.parameters)
+        this.parameters,
+      )}`;
+    }
+    else {
+      body = JSON.stringify(this.parameters);
     }
 
-    const url = new URL(urlString)
+    const url = new URL(urlString);
 
-    const controller = new AbortController()
-    const { signal } = controller
+    const controller = new AbortController();
+    const { signal } = controller;
 
-    let timeout
+    let timeout;
 
     if (this.timeout) {
-      timeout = setTimeout(() => controller.abort(), this.timeout)
+      timeout = setTimeout(() => controller.abort(), this.timeout);
     }
 
     try {
@@ -134,46 +135,48 @@ class SbFetch {
         body,
         signal,
         ...this.fetchOptions,
-      })
+      });
 
       if (this.timeout) {
-        clearTimeout(timeout)
+        clearTimeout(timeout);
       }
 
       const response = (await this._responseHandler(
-        fetchResponse
-      )) as ISbResponse
+        fetchResponse,
+      )) as ISbResponse;
 
       if (this.responseInterceptor && !this.ejectInterceptor) {
-        return this._statusHandler(this.responseInterceptor(response))
-      } else {
-        return this._statusHandler(response)
+        return this._statusHandler(this.responseInterceptor(response));
+      }
+      else {
+        return this._statusHandler(response);
       }
-    } catch (err: any) {
+    }
+    catch (err: any) {
       const error: ISbError = {
         message: err,
-      }
-      return error
+      };
+      return error;
     }
   }
 
   public setFetchOptions(fetchOptions: ISbCustomFetch = {}) {
     if (Object.keys(fetchOptions).length > 0 && 'method' in fetchOptions) {
-      delete fetchOptions.method
+      delete fetchOptions.method;
     }
-    this.fetchOptions = { ...fetchOptions }
+    this.fetchOptions = { ...fetchOptions };
   }
 
   public eject() {
-    this.ejectInterceptor = true
+    this.ejectInterceptor = true;
   }
 
   private _statusHandler(res: ISbResponse): Promise {
-    const statusOk = /20[0-6]/g
+    const statusOk = /20[0-6]/g;
 
     return new Promise((resolve, reject) => {
       if (statusOk.test(`${res.status}`)) {
-        return resolve(res)
+        return resolve(res);
       }
 
       const error: ISbError = {
@@ -182,11 +185,11 @@ class SbFetch {
         response: Array.isArray(res.data)
           ? res.data[0]
           : res.data.error || res.data.slug,
-      }
+      };
 
-      reject(error)
-    })
+      reject(error);
+    });
   }
 }
 
-export default SbFetch
+export default SbFetch;
diff --git a/src/sbHelpers.test.ts b/src/sbHelpers.test.ts
index da253afe..5b153251 100644
--- a/src/sbHelpers.test.ts
+++ b/src/sbHelpers.test.ts
@@ -1,152 +1,152 @@
-import { describe, it, expect, beforeEach, vi } from 'vitest'
-import { SbHelpers } from './sbHelpers'
+import { beforeEach, describe, expect, it, vi } from 'vitest';
+import { SbHelpers } from './sbHelpers';
 
-describe('SbHelpers', () => {
-  let helpers: SbHelpers
+describe('sbHelpers', () => {
+  let helpers: SbHelpers;
 
   beforeEach(() => {
-    helpers = new SbHelpers()
-  })
+    helpers = new SbHelpers();
+  });
 
   it('should create a new instance', () => {
-    expect(helpers).toBeDefined()
-    expect(helpers).toBeInstanceOf(SbHelpers)
-  })
+    expect(helpers).toBeDefined();
+    expect(helpers).toBeInstanceOf(SbHelpers);
+  });
 
   describe('isCDNUrl', () => {
     it('returns true if the URL contains /cdn/', () => {
-      expect(helpers.isCDNUrl('http://example.com/cdn/content')).toBe(true)
-    })
+      expect(helpers.isCDNUrl('http://example.com/cdn/content')).toBe(true);
+    });
 
     it('returns false if the URL does not contain /cdn/', () => {
-      expect(helpers.isCDNUrl('http://example.com/content')).toBe(false)
-    })
-  })
+      expect(helpers.isCDNUrl('http://example.com/content')).toBe(false);
+    });
+  });
 
   describe('getOptionsPage', () => {
     it('constructs options with default pagination', () => {
-      const options = { uuid: 'awiwi' }
+      const options = { uuid: 'awiwi' };
       expect(helpers.getOptionsPage(options)).toEqual({
         uuid: 'awiwi',
         per_page: 25,
         page: 1,
-      })
-    })
+      });
+    });
 
     it('overrides defaults when parameters are provided', () => {
       expect(helpers.getOptionsPage({ uuid: 'awiwi' }, 10, 2)).toEqual({
         uuid: 'awiwi',
         per_page: 10,
         page: 2,
-      })
-    })
-  })
+      });
+    });
+  });
 
   describe('delay', () => {
     it('delays execution by specified ms', async () => {
-      vi.useFakeTimers()
-      const promise = helpers.delay(1000)
-      vi.advanceTimersByTime(1000)
-      await expect(promise).resolves.toBeUndefined()
-      vi.useRealTimers()
-    })
-  })
+      vi.useFakeTimers();
+      const promise = helpers.delay(1000);
+      vi.advanceTimersByTime(1000);
+      await expect(promise).resolves.toBeUndefined();
+      vi.useRealTimers();
+    });
+  });
 
   describe.skip('range', () => {
     it('creates an array from start to end', () => {
       // TODO: This test is failing on the current implementation
-      expect(helpers.range(1, 5)).toEqual([1, 2, 3, 4, 5])
-      expect(helpers.range(5, 1)).toEqual([5, 4, 3, 2, 1])
-    })
-  })
+      expect(helpers.range(1, 5)).toEqual([1, 2, 3, 4, 5]);
+      expect(helpers.range(5, 1)).toEqual([5, 4, 3, 2, 1]);
+    });
+  });
 
   describe('asyncMap', () => {
     it('applies an async function to each element in the array', async () => {
-      const numbers = [1, 2, 3]
-      const doubleAsync = async (n: number) => n * 2
-      const results = await helpers.asyncMap(numbers, doubleAsync)
-      expect(results).toEqual([2, 4, 6])
-    })
-  })
+      const numbers = [1, 2, 3];
+      const doubleAsync = async (n: number) => n * 2;
+      const results = await helpers.asyncMap(numbers, doubleAsync);
+      expect(results).toEqual([2, 4, 6]);
+    });
+  });
 
   describe('flatMap', () => {
     it('maps and flattens the array based on the provided function', () => {
       const data = [
         { id: 1, values: [10, 20] },
         { id: 2, values: [30, 40] },
-      ]
-      const flattenValues = (item: { values: number[] }) => item.values
-      const result = helpers.flatMap(data, flattenValues)
-      expect(result).toEqual([10, 20, 30, 40])
-    })
-  })
+      ];
+      const flattenValues = (item: { values: number[] }) => item.values;
+      const result = helpers.flatMap(data, flattenValues);
+      expect(result).toEqual([10, 20, 30, 40]);
+    });
+  });
 
   describe('stringify', () => {
     it('stringifies simple objects', () => {
-      const params = { name: 'John', age: 30 }
-      const result = helpers.stringify(params)
-      expect(result).toBe('name=John&age=30')
-    })
+      const params = { name: 'John', age: 30 };
+      const result = helpers.stringify(params);
+      expect(result).toBe('name=John&age=30');
+    });
 
     it('handles arrays correctly', () => {
-      const params = { names: ['John', 'Jane'] }
-      const result = helpers.stringify(params, '', true)
-      expect(result).toBe('=John&=Jane')
-    })
-  })
+      const params = { names: ['John', 'Jane'] };
+      const result = helpers.stringify(params, '', true);
+      expect(result).toBe('=John&=Jane');
+    });
+  });
 
   describe('arrayFrom function', () => {
     it('arrayFrom(undefined, (v, i) => i)) should be an empty array', () => {
-      expect(helpers.arrayFrom(undefined, (_, i) => i)).toEqual([])
-    })
+      expect(helpers.arrayFrom(undefined, (_, i) => i)).toEqual([]);
+    });
 
     it('arrayFrom(0, (v, i) => i)) should be an empty array', () => {
-      expect(helpers.arrayFrom(0, (_, i) => i)).toEqual([])
-    })
+      expect(helpers.arrayFrom(0, (_, i) => i)).toEqual([]);
+    });
 
     it('arrayFrom(2, () => 1) should be an array with 1 and 1', () => {
-      expect(helpers.arrayFrom(2, () => 1)).toEqual([1, 1])
-    })
+      expect(helpers.arrayFrom(2, () => 1)).toEqual([1, 1]);
+    });
 
     it('arrayFrom(2, (v, i) => v)) should be an array with undefined values', () => {
-      expect(helpers.arrayFrom(2, (v) => v)).toEqual([undefined, undefined])
-    })
+      expect(helpers.arrayFrom(2, v => v)).toEqual([undefined, undefined]);
+    });
 
     it('arrayFrom(2, (v, i) => i) should be an array with 0 and 1', () => {
-      expect(helpers.arrayFrom(2, (v, i) => i)).toEqual([0, 1])
-    })
-  })
+      expect(helpers.arrayFrom(2, (v, i) => i)).toEqual([0, 1]);
+    });
+  });
 
   describe('getRegionURL', () => {
     it('returns the EU API URL by default', () => {
-      expect(helpers.getRegionURL()).toBe('api.storyblok.com')
-      expect(helpers.getRegionURL('unknown')).toBe('api.storyblok.com') // test for unrecognized region code
-    })
+      expect(helpers.getRegionURL()).toBe('api.storyblok.com');
+      expect(helpers.getRegionURL('unknown')).toBe('api.storyblok.com'); // test for unrecognized region code
+    });
 
     it('returns the US API URL when region code is "us"', () => {
-      expect(helpers.getRegionURL('us')).toBe('api-us.storyblok.com')
-    })
+      expect(helpers.getRegionURL('us')).toBe('api-us.storyblok.com');
+    });
 
     it('returns the CN API URL when region code is "cn"', () => {
-      expect(helpers.getRegionURL('cn')).toBe('app.storyblokchina.cn')
-    })
+      expect(helpers.getRegionURL('cn')).toBe('app.storyblokchina.cn');
+    });
 
     it('returns the AP API URL when region code is "ap"', () => {
-      expect(helpers.getRegionURL('ap')).toBe('api-ap.storyblok.com')
-    })
+      expect(helpers.getRegionURL('ap')).toBe('api-ap.storyblok.com');
+    });
 
     it('returns the CA API URL when region code is "ca"', () => {
-      expect(helpers.getRegionURL('ca')).toBe('api-ca.storyblok.com')
-    })
-  })
+      expect(helpers.getRegionURL('ca')).toBe('api-ca.storyblok.com');
+    });
+  });
 
   describe('escapeHTML', () => {
     it('escapes HTML characters', () => {
-      const str = '
Test & "more" test
' - const escaped = helpers.escapeHTML(str) + const str = '
Test & "more" test
'; + const escaped = helpers.escapeHTML(str); expect(escaped).toBe( - '<div>Test & "more" test</div>' - ) - }) - }) -}) + '<div>Test & "more" test</div>', + ); + }); + }); +}); diff --git a/src/sbHelpers.ts b/src/sbHelpers.ts index 96d718fe..75a22628 100644 --- a/src/sbHelpers.ts +++ b/src/sbHelpers.ts @@ -1,112 +1,118 @@ -import { ISbStoriesParams, ISbResult, AsyncFn, HtmlEscapes } from './interfaces' +import type { + AsyncFn, + HtmlEscapes, + ISbResult, + ISbStoriesParams, +} from './interfaces'; + interface ISbParams extends ISbStoriesParams { - [key: string]: any + [key: string]: any; } -type ArrayFn = (...args: any) => void +type ArrayFn = (...args: any) => void; -type FlatMapFn = (...args: any) => [] | any +type FlatMapFn = (...args: any) => [] | any; -type RangeFn = (...args: any) => [] +type RangeFn = (...args: any) => []; export class SbHelpers { - public isCDNUrl = (url = '') => url.indexOf('/cdn/') > -1 + public isCDNUrl = (url = '') => url.includes('/cdn/'); public getOptionsPage = ( options: ISbStoriesParams, perPage = 25, - page = 1 + page = 1, ) => { return { ...options, per_page: perPage, page, - } - } + }; + }; - public delay = (ms: number) => new Promise((res) => setTimeout(res, ms)) + public delay = (ms: number) => new Promise(res => setTimeout(res, ms)); - public arrayFrom = (length = 0, func: ArrayFn) => [...Array(length)].map(func) + public arrayFrom = (length = 0, func: ArrayFn) => Array.from({ length }, func); public range = (start = 0, end = start): Array => { - const length = Math.abs(end - start) || 0 - const step = start < end ? 1 : -1 - return this.arrayFrom(length, (_, i: number) => i * step + start) - } + const length = Math.abs(end - start) || 0; + const step = start < end ? 1 : -1; + return this.arrayFrom(length, (_, i: number) => i * step + start); + }; public asyncMap = async (arr: RangeFn[], func: AsyncFn) => - Promise.all(arr.map(func)) + Promise.all(arr.map(func)); public flatMap = (arr: ISbResult[] = [], func: FlatMapFn) => - arr.map(func).reduce((xs, ys) => [...xs, ...ys], []) + arr.map(func).reduce((xs, ys) => [...xs, ...ys], []); /** * @method stringify - * @param {Object} params - * @param {String} prefix - * @param {Boolean} isArray - * @return {String} Stringified object + * @param {object} params + * @param {string} prefix + * @param {boolean} isArray + * @return {string} Stringified object */ public stringify( params: ISbParams, prefix?: string, - isArray?: boolean + isArray?: boolean, ): string { - const pairs = [] + const pairs = []; for (const key in params) { if (!Object.prototype.hasOwnProperty.call(params, key)) { - continue + continue; } - const value = params[key] - const enkey = isArray ? '' : encodeURIComponent(key) - let pair + const value = params[key]; + const enkey = isArray ? '' : encodeURIComponent(key); + let pair; if (typeof value === 'object') { pair = this.stringify( value, - prefix ? prefix + encodeURIComponent('[' + enkey + ']') : enkey, - Array.isArray(value) - ) - } else { - pair = - (prefix ? prefix + encodeURIComponent('[' + enkey + ']') : enkey) + - '=' + - encodeURIComponent(value) + prefix ? prefix + encodeURIComponent(`[${enkey}]`) : enkey, + Array.isArray(value), + ); + } + else { + pair = `${ + prefix ? prefix + encodeURIComponent(`[${enkey}]`) : enkey + }=${encodeURIComponent(value)}`; } - pairs.push(pair) + pairs.push(pair); } - return pairs.join('&') + return pairs.join('&'); } /** * @method getRegionURL - * @param {String} regionCode region code, could be eu, us, cn, ap or ca - * @return {String} The base URL of the region + * @param {string} regionCode region code, could be eu, us, cn, ap or ca + * @return {string} The base URL of the region */ public getRegionURL(regionCode?: string): string { - const EU_API_URL = 'api.storyblok.com' - const US_API_URL = 'api-us.storyblok.com' - const CN_API_URL = 'app.storyblokchina.cn' - const AP_API_URL = 'api-ap.storyblok.com' - const CA_API_URL = 'api-ca.storyblok.com' + const EU_API_URL = 'api.storyblok.com'; + const US_API_URL = 'api-us.storyblok.com'; + const CN_API_URL = 'app.storyblokchina.cn'; + const AP_API_URL = 'api-ap.storyblok.com'; + const CA_API_URL = 'api-ca.storyblok.com'; switch (regionCode) { case 'us': - return US_API_URL + return US_API_URL; case 'cn': - return CN_API_URL + return CN_API_URL; case 'ap': - return AP_API_URL + return AP_API_URL; case 'ca': - return CA_API_URL + return CA_API_URL; default: - return EU_API_URL + return EU_API_URL; } } /** * @method escapeHTML - * @param {String} string text to be parsed - * @return {String} Text parsed + * @param {string} string text to be parsed + * @return {string} Text parsed */ public escapeHTML = function (string: string) { const htmlEscapes = { @@ -114,14 +120,14 @@ export class SbHelpers { '<': '<', '>': '>', '"': '"', - "'": ''', - } as HtmlEscapes + '\'': ''', + } as HtmlEscapes; - const reUnescapedHtml = /[&<>"']/g - const reHasUnescapedHtml = RegExp(reUnescapedHtml.source) + const reUnescapedHtml = /[&<>"']/g; + const reHasUnescapedHtml = new RegExp(reUnescapedHtml.source); return string && reHasUnescapedHtml.test(string) - ? string.replace(reUnescapedHtml, (chr) => htmlEscapes[chr]) - : string - } + ? string.replace(reUnescapedHtml, chr => htmlEscapes[chr]) + : string; + }; } diff --git a/src/schema.ts b/src/schema.ts index fed8eae4..939c2870 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -1,40 +1,45 @@ -import { ISbNode, NodeSchema, MarkSchema, ISbComponentType } from './interfaces' -import { SbHelpers } from './sbHelpers' +import type { + ISbComponentType, + ISbNode, + MarkSchema, + NodeSchema, +} from './interfaces'; +import { SbHelpers } from './sbHelpers'; const pick = function (attrs: Attrs, allowed: string[]) { - const h = {} as Attrs + const h = {} as Attrs; for (const key in attrs) { - const value = attrs[key] - if (allowed.indexOf(key) > -1 && value !== null) { - h[key] = value + const value = attrs[key]; + if (allowed.includes(key) && value !== null) { + h[key] = value; } } - return h -} + return h; +}; -const isEmailLinkType = (type: string) => type === 'email' +const isEmailLinkType = (type: string) => type === 'email'; -type Attrs = { - [key: string]: string | number | Array> +interface Attrs { + [key: string]: string | number | Array>; } // nodes const horizontal_rule: NodeSchema = () => { return { singleTag: 'hr', - } -} + }; +}; const blockquote: NodeSchema = () => { return { tag: 'blockquote', - } -} + }; +}; const bullet_list: NodeSchema = () => { return { tag: 'ul', - } -} + }; +}; const code_block: NodeSchema = (node: ISbNode) => { return { tag: [ @@ -44,18 +49,18 @@ const code_block: NodeSchema = (node: ISbNode) => { attrs: node.attrs, }, ], - } -} + }; +}; const hard_break: NodeSchema = () => { return { singleTag: 'br', - } -} + }; +}; const heading: NodeSchema = (node: ISbNode) => { return { tag: `h${node.attrs.level}`, - } -} + }; +}; const image: NodeSchema = (node: ISbNode) => { return { @@ -65,112 +70,112 @@ const image: NodeSchema = (node: ISbNode) => { attrs: pick(node.attrs, ['src', 'alt', 'title']), }, ], - } -} + }; +}; const list_item: NodeSchema = () => { return { tag: 'li', - } -} + }; +}; const ordered_list: NodeSchema = () => { return { tag: 'ol', - } -} + }; +}; const paragraph: NodeSchema = () => { return { tag: 'p', - } -} + }; +}; const emoji: NodeSchema = (node: ISbNode) => { const attrs = { - ['data-type']: 'emoji', - ['data-name']: node.attrs.name, - emoji: node.attrs.emoji, - } + 'data-type': 'emoji', + 'data-name': node.attrs.name, + 'emoji': node.attrs.emoji, + }; return { tag: [ { tag: 'span', - attrs: attrs, + attrs, }, ], - } -} + }; +}; // marks const bold: MarkSchema = () => { return { tag: 'b', - } -} + }; +}; const strike: MarkSchema = () => { return { tag: 's', - } -} + }; +}; const underline: MarkSchema = () => { return { tag: 'u', - } -} + }; +}; const strong: MarkSchema = () => { return { tag: 'strong', - } -} + }; +}; const code: MarkSchema = () => { return { tag: 'code', - } -} + }; +}; const italic: MarkSchema = () => { return { tag: 'i', - } -} + }; +}; const link: MarkSchema = (node: ISbNode) => { if (!node.attrs) { return { tag: '', - } + }; } - const escapeHTML = new SbHelpers().escapeHTML - const attrs = { ...node.attrs } - const { linktype = 'url' } = node.attrs - delete attrs.linktype + const escapeHTML = new SbHelpers().escapeHTML; + const attrs = { ...node.attrs }; + const { linktype = 'url' } = node.attrs; + delete attrs.linktype; if (attrs.href) { - attrs.href = escapeHTML(node.attrs.href || '') + attrs.href = escapeHTML(node.attrs.href || ''); } if (isEmailLinkType(linktype)) { - attrs.href = `mailto:${attrs.href}` + attrs.href = `mailto:${attrs.href}`; } if (attrs.anchor) { - attrs.href = `${attrs.href}#${attrs.anchor}` - delete attrs.anchor + attrs.href = `${attrs.href}#${attrs.anchor}`; + delete attrs.anchor; } if (attrs.custom) { for (const key in attrs.custom) { - attrs[key] = attrs.custom[key] + attrs[key] = attrs.custom[key]; } - delete attrs.custom + delete attrs.custom; } return { tag: [ { tag: 'a', - attrs: attrs, + attrs, }, ], - } -} + }; +}; const styled: MarkSchema = (node: ISbNode) => { return { @@ -180,20 +185,20 @@ const styled: MarkSchema = (node: ISbNode) => { attrs: node.attrs, }, ], - } -} + }; +}; const subscript: MarkSchema = () => { return { tag: 'sub', - } -} + }; +}; const superscript: MarkSchema = () => { return { tag: 'sup', - } -} + }; +}; const anchor: MarkSchema = (node: ISbNode) => { return { @@ -203,18 +208,19 @@ const anchor: MarkSchema = (node: ISbNode) => { attrs: node.attrs, }, ], - } -} + }; +}; const highlight: MarkSchema = (node: ISbNode) => { - if (!node.attrs?.color) + if (!node.attrs?.color) { return { tag: '', - } + }; + } const attrs = { - ['style']: `background-color:${node.attrs.color};`, - } + style: `background-color:${node.attrs.color};`, + }; return { tag: [ { @@ -222,18 +228,19 @@ const highlight: MarkSchema = (node: ISbNode) => { attrs, }, ], - } -} + }; +}; const textStyle: MarkSchema = (node: ISbNode) => { - if (!node.attrs?.color) + if (!node.attrs?.color) { return { tag: '', - } + }; + } const attrs = { - ['style']: `color:${node.attrs.color}`, - } + style: `color:${node.attrs.color}`, + }; return { tag: [ { @@ -241,8 +248,8 @@ const textStyle: MarkSchema = (node: ISbNode) => { attrs, }, ], - } -} + }; +}; export default { nodes: { @@ -273,4 +280,4 @@ export default { highlight, textStyle, }, -} +}; diff --git a/src/throttlePromise.ts b/src/throttlePromise.ts index 29e431ec..e24da82c 100644 --- a/src/throttlePromise.ts +++ b/src/throttlePromise.ts @@ -1,104 +1,95 @@ -import { ThrottleFn } from './interfaces' +import type { ThrottleFn } from './interfaces'; -type Shifted = { - args: any - self: any - resolve: (args: any) => any +interface Shifted { + args: any; + self: any; + resolve: (args: any) => any; } -type Queue = { - resolve: (args: any) => any - reject: (args: any) => any - args: any[] - self: any +interface Queue { + resolve: (args: any) => any; + reject: (args: any) => any; + args: any[]; + self: any; } interface ISbThrottle { - abort: () => any - (args: []): Promise - name: string - AbortError?: () => void -} - -function isFinite(value: number) { - if (value !== value || value === Infinity || value === -Infinity) { - return false - } - - return true + abort: () => any; + (args: []): Promise; + name: string; + AbortError?: () => void; } function throttledQueue(fn: ThrottleFn, limit: number, interval: number) { - if (!isFinite(limit)) { - throw new TypeError('Expected `limit` to be a finite number') + if (!Number.isFinite(limit)) { + throw new TypeError('Expected `limit` to be a finite number'); } - if (!isFinite(interval)) { - throw new TypeError('Expected `interval` to be a finite number') + if (!Number.isFinite(interval)) { + throw new TypeError('Expected `interval` to be a finite number'); } - const queue: Queue[] = [] - let timeouts: ReturnType[] = [] - let activeCount = 0 + const queue: Queue[] = []; + let timeouts: ReturnType[] = []; + let activeCount = 0; const next = function () { - activeCount++ + activeCount++; - const id = setTimeout(function () { - activeCount-- + const id = setTimeout(() => { + activeCount--; if (queue.length > 0) { - next() + next(); } - timeouts = timeouts.filter(function (currentId) { - return currentId !== id - }) - }, interval) + timeouts = timeouts.filter((currentId) => { + return currentId !== id; + }); + }, interval); - if (timeouts.indexOf(id) < 0) { - timeouts.push(id) + if (!timeouts.includes(id)) { + timeouts.push(id); } - const x = queue.shift() as unknown as Shifted - x.resolve(fn.apply(x.self, x.args)) - } + const x = queue.shift() as unknown as Shifted; + x.resolve(fn.apply(x.self, x.args)); + }; const throttled: ISbThrottle = function ( this: ISbThrottle, ...args: [] ): Promise { - // eslint-disable-next-line @typescript-eslint/no-this-alias - const self = this + const self = this; - return new Promise(function (resolve, reject) { + return new Promise((resolve, reject) => { queue.push({ - resolve: resolve, - reject: reject, - args: args, + resolve, + reject, + args, self, - }) + }); if (activeCount < limit) { - next() + next(); } - }) - } + }); + }; throttled.abort = function () { - timeouts.forEach(clearTimeout) - timeouts = [] + timeouts.forEach(clearTimeout); + timeouts = []; - queue.forEach(function (x) { + queue.forEach((x) => { x.reject(function (this: ISbThrottle) { - Error.call(this, 'Throttled function aborted') - this.name = 'AbortError' - }) - }) - queue.length = 0 - } - - return throttled + Error.call(this, 'Throttled function aborted'); + this.name = 'AbortError'; + }); + }); + queue.length = 0; + }; + + return throttled; } -export default throttledQueue +export default throttledQueue; diff --git a/tests/api/index.e2e.ts b/tests/api/index.e2e.ts index b729855e..5c02ec6a 100644 --- a/tests/api/index.e2e.ts +++ b/tests/api/index.e2e.ts @@ -52,7 +52,7 @@ describe('StoryblokClient', () => { it("get('cdn/stories/testcontent-draft', { version: 'draft' }) should return the specific story draft", async () => { const { data } = await client.get('cdn/stories/testcontent-draft', { - version: 'draft' + version: 'draft', }) expect(data.story.slug).toBe('testcontent-draft') }) diff --git a/vitest.config.ts b/vitest.config.ts index 8d177c97..c8d30041 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -7,7 +7,7 @@ export default defineConfig({ coverage: { include: ['src'], reporter: ['text', 'json', 'html'], - reportsDirectory: './tests/unit/coverage' + reportsDirectory: './tests/unit/coverage', }, }, })