Mirror: Best-effort discovery of the machine's local network using just Node.js dgram sockets

Compare changes

Choose any two refs to compare.

+5
.changeset/social-islands-bet.md
···
···
+
---
+
'lan-network': patch
+
---
+
+
Deprioritize `bridge*` interfaces as internal networks
+3
.github/workflows/ci.yml
···
- name: Build
run: pnpm run build
···
- name: Build
run: pnpm run build
+
+
- name: Unit tests
+
run: pnpm run test:run
+25
.github/workflows/mirror.yml
···
···
+
name: Mirror
+
on:
+
push:
+
branches:
+
- main
+
jobs:
+
mirror:
+
runs-on: ubuntu-latest
+
steps:
+
- name: Checkout repository
+
uses: actions/checkout@v4
+
with:
+
fetch-depth: 0
+
fetch-tags: true
+
- name: Mirror
+
env:
+
MIRROR_SSH_KEY: ${{ secrets.MIRROR_SSH_KEY }}
+
GIT_SSH_COMMAND: 'ssh -o StrictHostKeyChecking=yes'
+
run: |
+
mkdir -p ~/.ssh
+
echo "$MIRROR_SSH_KEY" > ~/.ssh/id_rsa
+
chmod 600 ~/.ssh/id_rsa
+
ssh-keyscan -H knot.kitten.sh >> ~/.ssh/known_hosts
+
git remote add mirror "git@knot.kitten.sh:kitten.sh/${GITHUB_REPOSITORY#*/}"
+
git push --mirror mirror
+2 -5
.github/workflows/release.yml
···
jobs:
release:
name: Release
-
runs-on: ubuntu-20.04
timeout-minutes: 20
permissions:
contents: write
···
- name: PR or Publish
id: changesets
-
uses: changesets/action@v1.4.5
with:
version: pnpm changeset:version
publish: pnpm changeset:publish
env:
-
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Publish Prerelease
if: steps.changesets.outputs.published != 'true'
env:
-
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
-
npm config set "//registry.npmjs.org/:_authToken" "$NPM_TOKEN"
git reset --hard origin/main
pnpm changeset version --no-git-tag --snapshot canary
pnpm changeset publish --no-git-tag --snapshot canary --tag canary
···
jobs:
release:
name: Release
+
runs-on: ubuntu-latest
timeout-minutes: 20
permissions:
contents: write
···
- name: PR or Publish
id: changesets
+
uses: changesets/action@v1.5.3
with:
version: pnpm changeset:version
publish: pnpm changeset:publish
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Publish Prerelease
if: steps.changesets.outputs.published != 'true'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
git reset --hard origin/main
pnpm changeset version --no-git-tag --snapshot canary
pnpm changeset publish --no-git-tag --snapshot canary --tag canary
+35
CHANGELOG.md
···
# lan-network
## 0.1.1
### Patch Changes
···
# lan-network
+
## 0.1.7
+
+
### Patch Changes
+
+
- Compare subnet-masked addresses before accepting DHCP discover message
+
Submitted by [@hyoban](https://github.com/hyoban) (See [#12](https://github.com/kitten/lan-network/pull/12))
+
+
## 0.1.6
+
+
### Patch Changes
+
+
- โš ๏ธ Fix probing and fallback methods for Windows
+
Submitted by [@kitten](https://github.com/kitten) (See [#9](https://github.com/kitten/lan-network/pull/9))
+
+
## 0.1.5
+
+
### Patch Changes
+
+
- When matching a probed route, ignore internal interfaces. The probed route will match a VPN (virtual) interface when using it to tunnel all traffic, but is unlikely to be considered the local network by users
+
Submitted by [@kitten](https://github.com/kitten) (See [#7](https://github.com/kitten/lan-network/pull/7))
+
+
## 0.1.3
+
+
### Patch Changes
+
+
- Move vitest to devDependencies
+
Submitted by [@kitten](https://github.com/kitten) (See [#5](https://github.com/kitten/lan-network/pull/5))
+
+
## 0.1.2
+
+
### Patch Changes
+
+
- Add CLI for testing
+
Submitted by [@kitten](https://github.com/kitten) (See [#3](https://github.com/kitten/lan-network/pull/3))
+
## 0.1.1
### Patch Changes
-3
LICENSE.md
···
MIT License
Copyright (c) Phil Pluckthun,
-
Copyright (c) 2016 - 2020 Node Fetch Team,
-
Copyright (c) Remix Software Inc. 2020-2021,
-
Copyright (c) Shopify Inc. 2022-2024
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
···
MIT License
Copyright (c) Phil Pluckthun,
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+15
cli/package.json
···
···
+
{
+
"name": "lan-network-cli",
+
"private": true,
+
"version": "0.0.0",
+
"main": "../dist/lan-network-cli.js",
+
"types": "../dist/lan-network-cli.d.ts",
+
"source": "../src/cli.ts",
+
"exports": {
+
".": {
+
"types": "../dist/lan-network-cli.d.ts",
+
"require": "../dist/lan-network-cli.js",
+
"source": "../src/cli.ts"
+
}
+
}
+
}
+15 -4
package.json
···
{
"name": "lan-network",
-
"version": "0.1.1",
"description": "Best-effort discovery of the machine's default gateway and local network IP exclusively with UDP sockets.",
"author": "Phil Pluckthun <phil@kitten.sh>",
"source": "./src/index.ts",
···
"dist/"
],
"scripts": {
"build": "rollup -c ./scripts/rollup.config.mjs",
"postbuild": "tsc --noEmit ./dist/lan-network.d.ts",
"check": "tsc --noEmit",
"clean": "rimraf dist node_modules/.cache",
-
"prepublishOnly": "run-s clean build check",
"prepare": "node ./scripts/prepare.js || true",
"changeset:version": "changeset version && pnpm install --lockfile-only",
"changeset:publish": "changeset publish"
},
"exports": {
".": {
···
"require": "./dist/lan-network-subprocess.js",
"source": "./src/subprocess.ts"
},
"./package.json": "./package.json"
},
"prettier": {
···
"devDependencies": {
"@babel/plugin-transform-block-scoping": "^7.25.9",
"@babel/plugin-transform-typescript": "^7.26.7",
-
"@changesets/cli": "^2.27.1",
"@changesets/get-github-info": "^0.6.0",
"@rollup/plugin-babel": "^6.0.4",
"@rollup/plugin-commonjs": "^28.0.2",
···
"rollup": "^4.32.1",
"rollup-plugin-cjs-check": "^1.0.3",
"rollup-plugin-dts": "^6.1.1",
-
"typescript": "^5.7.3"
},
"publishConfig": {
"access": "public",
···
{
"name": "lan-network",
+
"version": "0.1.7",
"description": "Best-effort discovery of the machine's default gateway and local network IP exclusively with UDP sockets.",
"author": "Phil Pluckthun <phil@kitten.sh>",
"source": "./src/index.ts",
···
"dist/"
],
"scripts": {
+
"test": "vitest test",
+
"test:run": "vitest test --run",
"build": "rollup -c ./scripts/rollup.config.mjs",
"postbuild": "tsc --noEmit ./dist/lan-network.d.ts",
"check": "tsc --noEmit",
"clean": "rimraf dist node_modules/.cache",
+
"prepublishOnly": "run-s clean build check test:run",
"prepare": "node ./scripts/prepare.js || true",
"changeset:version": "changeset version && pnpm install --lockfile-only",
"changeset:publish": "changeset publish"
+
},
+
"bin": {
+
"lan-network": "./dist/lan-network-cli.js"
},
"exports": {
".": {
···
"require": "./dist/lan-network-subprocess.js",
"source": "./src/subprocess.ts"
},
+
"./cli": {
+
"types": "./dist/lan-network-cli.d.ts",
+
"require": "./dist/lan-network-cli.js",
+
"source": "./src/cli.ts"
+
},
"./package.json": "./package.json"
},
"prettier": {
···
"devDependencies": {
"@babel/plugin-transform-block-scoping": "^7.25.9",
"@babel/plugin-transform-typescript": "^7.26.7",
+
"@changesets/cli": "^2.29.6",
"@changesets/get-github-info": "^0.6.0",
"@rollup/plugin-babel": "^6.0.4",
"@rollup/plugin-commonjs": "^28.0.2",
···
"rollup": "^4.32.1",
"rollup-plugin-cjs-check": "^1.0.3",
"rollup-plugin-dts": "^6.1.1",
+
"typescript": "^5.7.3",
+
"vitest": "^3.0.6"
},
"publishConfig": {
"access": "public",
+906 -163
pnpm-lock.yaml
···
specifier: ^7.26.7
version: 7.26.7(@babel/core@7.26.7)
'@changesets/cli':
-
specifier: ^2.27.1
-
version: 2.27.12
'@changesets/get-github-info':
specifier: ^0.6.0
version: 0.6.0
···
typescript:
specifier: ^5.7.3
version: 5.7.3
packages:
···
resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
engines: {node: '>=6.9.0'}
-
'@babel/compat-data@7.26.5':
-
resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==}
engines: {node: '>=6.9.0'}
'@babel/core@7.26.7':
···
resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==}
engines: {node: '>=6.9.0'}
'@babel/helper-annotate-as-pure@7.25.9':
resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==}
engines: {node: '>=6.9.0'}
-
'@babel/helper-compilation-targets@7.26.5':
-
resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==}
engines: {node: '>=6.9.0'}
'@babel/helper-create-class-features-plugin@7.25.9':
···
peerDependencies:
'@babel/core': ^7.0.0
'@babel/helper-member-expression-to-functions@7.25.9':
resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==}
engines: {node: '>=6.9.0'}
···
resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
engines: {node: '>=6.9.0'}
-
'@babel/helper-module-transforms@7.26.0':
-
resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
···
resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
engines: {node: '>=6.9.0'}
'@babel/helper-validator-identifier@7.25.9':
resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
engines: {node: '>=6.9.0'}
-
'@babel/helper-validator-option@7.25.9':
-
resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
engines: {node: '>=6.9.0'}
-
'@babel/helpers@7.26.7':
-
resolution: {integrity: sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==}
engines: {node: '>=6.9.0'}
'@babel/parser@7.26.7':
···
engines: {node: '>=6.0.0'}
hasBin: true
'@babel/plugin-syntax-typescript@7.25.9':
resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==}
engines: {node: '>=6.9.0'}
···
resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==}
engines: {node: '>=6.9.0'}
'@babel/traverse@7.26.7':
resolution: {integrity: sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==}
engines: {node: '>=6.9.0'}
'@babel/types@7.26.7':
resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==}
engines: {node: '>=6.9.0'}
-
'@changesets/apply-release-plan@7.0.8':
-
resolution: {integrity: sha512-qjMUj4DYQ1Z6qHawsn7S71SujrExJ+nceyKKyI9iB+M5p9lCL55afuEd6uLBPRpLGWQwkwvWegDHtwHJb1UjpA==}
-
'@changesets/assemble-release-plan@6.0.5':
-
resolution: {integrity: sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==}
-
'@changesets/changelog-git@0.2.0':
-
resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==}
-
'@changesets/cli@2.27.12':
-
resolution: {integrity: sha512-9o3fOfHYOvBnyEn0mcahB7wzaA3P4bGJf8PNqGit5PKaMEFdsRixik+txkrJWd2VX+O6wRFXpxQL8j/1ANKE9g==}
hasBin: true
-
'@changesets/config@3.0.5':
-
resolution: {integrity: sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ==}
'@changesets/errors@0.2.0':
resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==}
-
'@changesets/get-dependents-graph@2.1.2':
-
resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==}
'@changesets/get-github-info@0.6.0':
resolution: {integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==}
-
'@changesets/get-release-plan@4.0.6':
-
resolution: {integrity: sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w==}
'@changesets/get-version-range-type@0.4.0':
resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==}
-
'@changesets/git@3.0.2':
-
resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==}
'@changesets/logger@0.1.1':
resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==}
-
'@changesets/parse@0.4.0':
-
resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==}
-
'@changesets/pre@2.0.1':
-
resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==}
-
'@changesets/read@0.6.2':
-
resolution: {integrity: sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==}
-
'@changesets/should-skip-package@0.1.1':
-
resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==}
'@changesets/types@4.1.0':
resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==}
-
'@changesets/types@6.0.0':
-
resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==}
-
'@changesets/write@0.3.2':
-
resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==}
'@isaacs/cliui@8.0.2':
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'}
'@jridgewell/gen-mapping@0.3.8':
resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
···
'@jridgewell/sourcemap-codec@1.5.0':
resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
'@jridgewell/trace-mapping@0.3.25':
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
'@manypkg/find-root@1.1.0':
resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==}
···
'@types/resolve@1.20.2':
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
acorn@8.14.0:
resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==}
engines: {node: '>=0.4.0'}
···
resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
engines: {node: '>= 0.4'}
async-function@1.0.0:
resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
engines: {node: '>= 0.4'}
···
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
-
browserslist@4.24.4:
-
resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
buffer-from@1.1.2:
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
call-bind-apply-helpers@1.0.1:
resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==}
···
resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==}
engines: {node: '>= 0.4'}
-
caniuse-lite@1.0.30001696:
-
resolution: {integrity: sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==}
chalk@2.4.2:
resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
···
resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==}
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
-
chardet@0.7.0:
-
resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
ci-info@3.9.0:
resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
···
supports-color:
optional: true
deepmerge@4.3.1:
resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
engines: {node: '>=0.10.0'}
···
eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
-
electron-to-chromium@1.5.90:
-
resolution: {integrity: sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug==}
emoji-regex@10.4.0:
resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
···
es-errors@1.3.0:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
es-object-atoms@1.1.1:
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
···
resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
engines: {node: '>= 0.4'}
escalade@3.2.0:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
···
estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
eventemitter3@5.0.1:
resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
···
resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
engines: {node: '>=16.17'}
extendable-error@0.1.7:
resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==}
-
-
external-editor@3.1.0:
-
resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
-
engines: {node: '>=4'}
fast-glob@3.3.3:
resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
···
hosted-git-info@2.8.9:
resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
-
human-id@1.0.2:
-
resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==}
human-signals@5.0.0:
resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
engines: {node: '>=16.17.0'}
-
iconv-lite@0.4.24:
-
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
engines: {node: '>=0.10.0'}
ignore@5.3.2:
···
resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==}
engines: {node: '>=18'}
lru-cache@11.0.2:
resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==}
engines: {node: 20 || >=22}
···
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
nice-try@1.0.5:
resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==}
···
resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
engines: {node: '>=18'}
-
os-tmpdir@1.0.2:
-
resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
-
engines: {node: '>=0.10.0'}
-
outdent@0.5.0:
resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==}
···
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'}
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
···
possible-typed-array-names@1.0.0:
resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
engines: {node: '>= 0.4'}
prettier@2.8.8:
resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
···
resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
engines: {node: '>= 0.4'}
signal-exit@4.1.0:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'}
···
smob@1.5.0:
resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==}
source-map-support@0.5.21:
resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
···
sprintf-js@1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
string-argv@0.3.2:
resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
···
engines: {node: '>=10'}
hasBin: true
-
tmp@0.0.33:
-
resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
-
engines: {node: '>=0.6.0'}
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
···
resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
engines: {node: '>= 4.0.0'}
-
update-browserslist-db@1.1.2:
-
resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==}
hasBin: true
peerDependencies:
browserslist: '>= 4.21.0'
···
validate-npm-package-license@3.0.4:
resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
webidl-conversions@3.0.1:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
···
engines: {node: '>= 8'}
hasBin: true
wrap-ansi@7.0.0:
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
engines: {node: '>=10'}
···
'@ampproject/remapping@2.3.0':
dependencies:
-
'@jridgewell/gen-mapping': 0.3.8
-
'@jridgewell/trace-mapping': 0.3.25
'@babel/code-frame@7.26.2':
dependencies:
···
js-tokens: 4.0.0
picocolors: 1.1.1
-
'@babel/compat-data@7.26.5': {}
'@babel/core@7.26.7':
dependencies:
'@ampproject/remapping': 2.3.0
-
'@babel/code-frame': 7.26.2
-
'@babel/generator': 7.26.5
-
'@babel/helper-compilation-targets': 7.26.5
-
'@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.7)
-
'@babel/helpers': 7.26.7
-
'@babel/parser': 7.26.7
-
'@babel/template': 7.25.9
-
'@babel/traverse': 7.26.7
-
'@babel/types': 7.26.7
convert-source-map: 2.0.0
-
debug: 4.4.0
gensync: 1.0.0-beta.2
json5: 2.2.3
semver: 6.3.1
···
'@jridgewell/trace-mapping': 0.3.25
jsesc: 3.1.0
'@babel/helper-annotate-as-pure@7.25.9':
dependencies:
'@babel/types': 7.26.7
-
'@babel/helper-compilation-targets@7.26.5':
dependencies:
-
'@babel/compat-data': 7.26.5
-
'@babel/helper-validator-option': 7.25.9
-
browserslist: 4.24.4
lru-cache: 5.1.1
semver: 6.3.1
···
semver: 6.3.1
transitivePeerDependencies:
- supports-color
'@babel/helper-member-expression-to-functions@7.25.9':
dependencies:
···
transitivePeerDependencies:
- supports-color
-
'@babel/helper-module-transforms@7.26.0(@babel/core@7.26.7)':
dependencies:
'@babel/core': 7.26.7
-
'@babel/helper-module-imports': 7.25.9
-
'@babel/helper-validator-identifier': 7.25.9
-
'@babel/traverse': 7.26.7
transitivePeerDependencies:
- supports-color
···
'@babel/helper-string-parser@7.25.9': {}
'@babel/helper-validator-identifier@7.25.9': {}
-
'@babel/helper-validator-option@7.25.9': {}
-
'@babel/helpers@7.26.7':
dependencies:
-
'@babel/template': 7.25.9
-
'@babel/types': 7.26.7
'@babel/parser@7.26.7':
dependencies:
'@babel/types': 7.26.7
'@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.7)':
dependencies:
···
'@babel/code-frame': 7.26.2
'@babel/parser': 7.26.7
'@babel/types': 7.26.7
'@babel/traverse@7.26.7':
dependencies:
···
transitivePeerDependencies:
- supports-color
'@babel/types@7.26.7':
dependencies:
'@babel/helper-string-parser': 7.25.9
'@babel/helper-validator-identifier': 7.25.9
-
'@changesets/apply-release-plan@7.0.8':
dependencies:
-
'@changesets/config': 3.0.5
'@changesets/get-version-range-type': 0.4.0
-
'@changesets/git': 3.0.2
-
'@changesets/should-skip-package': 0.1.1
-
'@changesets/types': 6.0.0
'@manypkg/get-packages': 1.1.3
detect-indent: 6.1.0
fs-extra: 7.0.1
···
resolve-from: 5.0.0
semver: 7.7.0
-
'@changesets/assemble-release-plan@6.0.5':
dependencies:
'@changesets/errors': 0.2.0
-
'@changesets/get-dependents-graph': 2.1.2
-
'@changesets/should-skip-package': 0.1.1
-
'@changesets/types': 6.0.0
'@manypkg/get-packages': 1.1.3
semver: 7.7.0
-
'@changesets/changelog-git@0.2.0':
dependencies:
-
'@changesets/types': 6.0.0
-
'@changesets/cli@2.27.12':
dependencies:
-
'@changesets/apply-release-plan': 7.0.8
-
'@changesets/assemble-release-plan': 6.0.5
-
'@changesets/changelog-git': 0.2.0
-
'@changesets/config': 3.0.5
'@changesets/errors': 0.2.0
-
'@changesets/get-dependents-graph': 2.1.2
-
'@changesets/get-release-plan': 4.0.6
-
'@changesets/git': 3.0.2
'@changesets/logger': 0.1.1
-
'@changesets/pre': 2.0.1
-
'@changesets/read': 0.6.2
-
'@changesets/should-skip-package': 0.1.1
-
'@changesets/types': 6.0.0
-
'@changesets/write': 0.3.2
'@manypkg/get-packages': 1.1.3
ansi-colors: 4.1.3
ci-info: 3.9.0
enquirer: 2.4.1
-
external-editor: 3.1.0
fs-extra: 7.0.1
mri: 1.2.0
p-limit: 2.3.0
···
semver: 7.7.0
spawndamnit: 3.0.1
term-size: 2.2.1
-
'@changesets/config@3.0.5':
dependencies:
'@changesets/errors': 0.2.0
-
'@changesets/get-dependents-graph': 2.1.2
'@changesets/logger': 0.1.1
-
'@changesets/types': 6.0.0
'@manypkg/get-packages': 1.1.3
fs-extra: 7.0.1
micromatch: 4.0.8
···
dependencies:
extendable-error: 0.1.7
-
'@changesets/get-dependents-graph@2.1.2':
dependencies:
-
'@changesets/types': 6.0.0
'@manypkg/get-packages': 1.1.3
picocolors: 1.1.1
semver: 7.7.0
···
transitivePeerDependencies:
- encoding
-
'@changesets/get-release-plan@4.0.6':
dependencies:
-
'@changesets/assemble-release-plan': 6.0.5
-
'@changesets/config': 3.0.5
-
'@changesets/pre': 2.0.1
-
'@changesets/read': 0.6.2
-
'@changesets/types': 6.0.0
'@manypkg/get-packages': 1.1.3
'@changesets/get-version-range-type@0.4.0': {}
-
'@changesets/git@3.0.2':
dependencies:
'@changesets/errors': 0.2.0
'@manypkg/get-packages': 1.1.3
···
dependencies:
picocolors: 1.1.1
-
'@changesets/parse@0.4.0':
dependencies:
-
'@changesets/types': 6.0.0
js-yaml: 3.14.1
-
'@changesets/pre@2.0.1':
dependencies:
'@changesets/errors': 0.2.0
-
'@changesets/types': 6.0.0
'@manypkg/get-packages': 1.1.3
fs-extra: 7.0.1
-
'@changesets/read@0.6.2':
dependencies:
-
'@changesets/git': 3.0.2
'@changesets/logger': 0.1.1
-
'@changesets/parse': 0.4.0
-
'@changesets/types': 6.0.0
fs-extra: 7.0.1
p-filter: 2.1.0
picocolors: 1.1.1
-
'@changesets/should-skip-package@0.1.1':
dependencies:
-
'@changesets/types': 6.0.0
'@manypkg/get-packages': 1.1.3
'@changesets/types@4.1.0': {}
-
'@changesets/types@6.0.0': {}
-
'@changesets/write@0.3.2':
dependencies:
-
'@changesets/types': 6.0.0
fs-extra: 7.0.1
-
human-id: 1.0.2
prettier: 2.8.8
'@isaacs/cliui@8.0.2':
dependencies:
string-width: 5.1.2
···
wrap-ansi: 8.1.0
wrap-ansi-cjs: wrap-ansi@7.0.0
'@jridgewell/gen-mapping@0.3.8':
dependencies:
'@jridgewell/set-array': 1.2.1
···
'@jridgewell/sourcemap-codec@1.5.0': {}
'@jridgewell/trace-mapping@0.3.25':
dependencies:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.0
'@manypkg/find-root@1.1.0':
dependencies:
···
'@types/resolve@1.20.2': {}
acorn@8.14.0: {}
ansi-colors@4.1.3: {}
···
get-intrinsic: 1.2.7
is-array-buffer: 3.0.5
async-function@1.0.0: {}
available-typed-arrays@1.0.7:
···
dependencies:
fill-range: 7.1.1
-
browserslist@4.24.4:
dependencies:
-
caniuse-lite: 1.0.30001696
-
electron-to-chromium: 1.5.90
node-releases: 2.0.19
-
update-browserslist-db: 1.1.2(browserslist@4.24.4)
buffer-from@1.1.2: {}
call-bind-apply-helpers@1.0.1:
dependencies:
···
call-bind-apply-helpers: 1.0.1
get-intrinsic: 1.2.7
-
caniuse-lite@1.0.30001696: {}
chalk@2.4.2:
dependencies:
···
chalk@5.4.1: {}
-
chardet@0.7.0: {}
ci-info@3.9.0: {}
···
dependencies:
ms: 2.1.3
deepmerge@4.3.1: {}
define-data-property@1.1.4:
···
eastasianwidth@0.2.0: {}
-
electron-to-chromium@1.5.90: {}
emoji-regex@10.4.0: {}
···
es-errors@1.3.0: {}
es-object-atoms@1.1.1:
dependencies:
es-errors: 1.3.0
···
is-date-object: 1.1.0
is-symbol: 1.1.1
escalade@3.2.0: {}
escape-string-regexp@1.0.5: {}
···
esprima@4.0.1: {}
estree-walker@2.0.2: {}
eventemitter3@5.0.1: {}
···
signal-exit: 4.1.0
strip-final-newline: 3.0.0
-
extendable-error@0.1.7: {}
-
external-editor@3.1.0:
-
dependencies:
-
chardet: 0.7.0
-
iconv-lite: 0.4.24
-
tmp: 0.0.33
fast-glob@3.3.3:
dependencies:
···
hosted-git-info@2.8.9: {}
-
human-id@1.0.2: {}
human-signals@5.0.0: {}
-
iconv-lite@0.4.24:
dependencies:
safer-buffer: 2.1.2
···
strip-ansi: 7.1.0
wrap-ansi: 9.0.0
lru-cache@11.0.2: {}
lru-cache@5.1.1:
···
mri@1.2.0: {}
ms@2.1.3: {}
nice-try@1.0.5: {}
···
dependencies:
mimic-function: 5.0.1
-
os-tmpdir@1.0.2: {}
-
outdent@0.5.0: {}
own-keys@1.0.1:
···
path-type@4.0.0: {}
picocolors@1.1.1: {}
picomatch@2.3.1: {}
···
pify@4.0.1: {}
possible-typed-array-names@1.0.0: {}
prettier@2.8.8: {}
···
side-channel-map: 1.0.1
side-channel-weakmap: 1.0.2
signal-exit@4.1.0: {}
slash@3.0.0: {}
···
is-fullwidth-code-point: 5.0.0
smob@1.5.0: {}
source-map-support@0.5.21:
dependencies:
···
spdx-license-ids@3.0.21: {}
sprintf-js@1.0.3: {}
string-argv@0.3.2: {}
···
commander: 2.20.3
source-map-support: 0.5.21
-
tmp@0.0.33:
-
dependencies:
-
os-tmpdir: 1.0.2
to-regex-range@5.0.1:
dependencies:
···
universalify@0.1.2: {}
-
update-browserslist-db@1.1.2(browserslist@4.24.4):
dependencies:
-
browserslist: 4.24.4
escalade: 3.2.0
picocolors: 1.1.1
···
spdx-correct: 3.2.0
spdx-expression-parse: 3.0.1
webidl-conversions@3.0.1: {}
whatwg-url@5.0.0:
···
which@2.0.2:
dependencies:
isexe: 2.0.0
wrap-ansi@7.0.0:
dependencies:
···
specifier: ^7.26.7
version: 7.26.7(@babel/core@7.26.7)
'@changesets/cli':
+
specifier: ^2.29.6
+
version: 2.29.6(@types/node@22.12.0)
'@changesets/get-github-info':
specifier: ^0.6.0
version: 0.6.0
···
typescript:
specifier: ^5.7.3
version: 5.7.3
+
vitest:
+
specifier: ^3.0.6
+
version: 3.0.6(@types/node@22.12.0)(terser@5.37.0)(yaml@2.7.0)
packages:
···
resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
engines: {node: '>=6.9.0'}
+
'@babel/code-frame@7.27.1':
+
resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
+
engines: {node: '>=6.9.0'}
+
+
'@babel/compat-data@7.28.0':
+
resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==}
engines: {node: '>=6.9.0'}
'@babel/core@7.26.7':
···
resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==}
engines: {node: '>=6.9.0'}
+
'@babel/generator@7.28.3':
+
resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==}
+
engines: {node: '>=6.9.0'}
+
'@babel/helper-annotate-as-pure@7.25.9':
resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==}
engines: {node: '>=6.9.0'}
+
'@babel/helper-compilation-targets@7.27.2':
+
resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
engines: {node: '>=6.9.0'}
'@babel/helper-create-class-features-plugin@7.25.9':
···
peerDependencies:
'@babel/core': ^7.0.0
+
'@babel/helper-globals@7.28.0':
+
resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
+
engines: {node: '>=6.9.0'}
+
'@babel/helper-member-expression-to-functions@7.25.9':
resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==}
engines: {node: '>=6.9.0'}
···
resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
engines: {node: '>=6.9.0'}
+
'@babel/helper-module-imports@7.27.1':
+
resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
+
engines: {node: '>=6.9.0'}
+
+
'@babel/helper-module-transforms@7.28.3':
+
resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
···
resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
engines: {node: '>=6.9.0'}
+
'@babel/helper-string-parser@7.27.1':
+
resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+
engines: {node: '>=6.9.0'}
+
'@babel/helper-validator-identifier@7.25.9':
resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
engines: {node: '>=6.9.0'}
+
'@babel/helper-validator-identifier@7.27.1':
+
resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
engines: {node: '>=6.9.0'}
+
'@babel/helper-validator-option@7.27.1':
+
resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
+
engines: {node: '>=6.9.0'}
+
+
'@babel/helpers@7.28.3':
+
resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==}
engines: {node: '>=6.9.0'}
'@babel/parser@7.26.7':
···
engines: {node: '>=6.0.0'}
hasBin: true
+
'@babel/parser@7.28.3':
+
resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==}
+
engines: {node: '>=6.0.0'}
+
hasBin: true
+
'@babel/plugin-syntax-typescript@7.25.9':
resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==}
engines: {node: '>=6.9.0'}
···
resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==}
engines: {node: '>=6.9.0'}
+
'@babel/template@7.27.2':
+
resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
+
engines: {node: '>=6.9.0'}
+
'@babel/traverse@7.26.7':
resolution: {integrity: sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==}
engines: {node: '>=6.9.0'}
+
'@babel/traverse@7.28.3':
+
resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==}
+
engines: {node: '>=6.9.0'}
+
'@babel/types@7.26.7':
resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==}
engines: {node: '>=6.9.0'}
+
'@babel/types@7.28.2':
+
resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==}
+
engines: {node: '>=6.9.0'}
+
+
'@changesets/apply-release-plan@7.0.12':
+
resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==}
+
'@changesets/assemble-release-plan@6.0.9':
+
resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==}
+
'@changesets/changelog-git@0.2.1':
+
resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==}
+
'@changesets/cli@2.29.6':
+
resolution: {integrity: sha512-6qCcVsIG1KQLhpQ5zE8N0PckIx4+9QlHK3z6/lwKnw7Tir71Bjw8BeOZaxA/4Jt00pcgCnCSWZnyuZf5Il05QQ==}
hasBin: true
+
'@changesets/config@3.1.1':
+
resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==}
'@changesets/errors@0.2.0':
resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==}
+
'@changesets/get-dependents-graph@2.1.3':
+
resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==}
'@changesets/get-github-info@0.6.0':
resolution: {integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==}
+
'@changesets/get-release-plan@4.0.13':
+
resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==}
'@changesets/get-version-range-type@0.4.0':
resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==}
+
'@changesets/git@3.0.4':
+
resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==}
'@changesets/logger@0.1.1':
resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==}
+
'@changesets/parse@0.4.1':
+
resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==}
+
'@changesets/pre@2.0.2':
+
resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==}
+
'@changesets/read@0.6.5':
+
resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==}
+
'@changesets/should-skip-package@0.1.2':
+
resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==}
'@changesets/types@4.1.0':
resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==}
+
'@changesets/types@6.1.0':
+
resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==}
+
+
'@changesets/write@0.4.0':
+
resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==}
+
+
'@esbuild/aix-ppc64@0.24.2':
+
resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==}
+
engines: {node: '>=18'}
+
cpu: [ppc64]
+
os: [aix]
+
+
'@esbuild/android-arm64@0.24.2':
+
resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [android]
+
+
'@esbuild/android-arm@0.24.2':
+
resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==}
+
engines: {node: '>=18'}
+
cpu: [arm]
+
os: [android]
+
+
'@esbuild/android-x64@0.24.2':
+
resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [android]
+
+
'@esbuild/darwin-arm64@0.24.2':
+
resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [darwin]
+
+
'@esbuild/darwin-x64@0.24.2':
+
resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [darwin]
+
+
'@esbuild/freebsd-arm64@0.24.2':
+
resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [freebsd]
+
+
'@esbuild/freebsd-x64@0.24.2':
+
resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [freebsd]
+
+
'@esbuild/linux-arm64@0.24.2':
+
resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [linux]
+
+
'@esbuild/linux-arm@0.24.2':
+
resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==}
+
engines: {node: '>=18'}
+
cpu: [arm]
+
os: [linux]
+
+
'@esbuild/linux-ia32@0.24.2':
+
resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==}
+
engines: {node: '>=18'}
+
cpu: [ia32]
+
os: [linux]
+
+
'@esbuild/linux-loong64@0.24.2':
+
resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==}
+
engines: {node: '>=18'}
+
cpu: [loong64]
+
os: [linux]
+
+
'@esbuild/linux-mips64el@0.24.2':
+
resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==}
+
engines: {node: '>=18'}
+
cpu: [mips64el]
+
os: [linux]
+
+
'@esbuild/linux-ppc64@0.24.2':
+
resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==}
+
engines: {node: '>=18'}
+
cpu: [ppc64]
+
os: [linux]
+
+
'@esbuild/linux-riscv64@0.24.2':
+
resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==}
+
engines: {node: '>=18'}
+
cpu: [riscv64]
+
os: [linux]
+
+
'@esbuild/linux-s390x@0.24.2':
+
resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==}
+
engines: {node: '>=18'}
+
cpu: [s390x]
+
os: [linux]
+
+
'@esbuild/linux-x64@0.24.2':
+
resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [linux]
+
+
'@esbuild/netbsd-arm64@0.24.2':
+
resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [netbsd]
+
+
'@esbuild/netbsd-x64@0.24.2':
+
resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [netbsd]
+
+
'@esbuild/openbsd-arm64@0.24.2':
+
resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [openbsd]
+
+
'@esbuild/openbsd-x64@0.24.2':
+
resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [openbsd]
+
+
'@esbuild/sunos-x64@0.24.2':
+
resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [sunos]
+
+
'@esbuild/win32-arm64@0.24.2':
+
resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [win32]
+
+
'@esbuild/win32-ia32@0.24.2':
+
resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==}
+
engines: {node: '>=18'}
+
cpu: [ia32]
+
os: [win32]
+
+
'@esbuild/win32-x64@0.24.2':
+
resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [win32]
+
'@inquirer/external-editor@1.0.1':
+
resolution: {integrity: sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==}
+
engines: {node: '>=18'}
+
peerDependencies:
+
'@types/node': '>=18'
+
peerDependenciesMeta:
+
'@types/node':
+
optional: true
'@isaacs/cliui@8.0.2':
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'}
+
+
'@jridgewell/gen-mapping@0.3.13':
+
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
'@jridgewell/gen-mapping@0.3.8':
resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
···
'@jridgewell/sourcemap-codec@1.5.0':
resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+
'@jridgewell/sourcemap-codec@1.5.5':
+
resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
'@jridgewell/trace-mapping@0.3.25':
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+
+
'@jridgewell/trace-mapping@0.3.30':
+
resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==}
'@manypkg/find-root@1.1.0':
resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==}
···
'@types/resolve@1.20.2':
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
+
'@vitest/expect@3.0.6':
+
resolution: {integrity: sha512-zBduHf/ja7/QRX4HdP1DSq5XrPgdN+jzLOwaTq/0qZjYfgETNFCKf9nOAp2j3hmom3oTbczuUzrzg9Hafh7hNg==}
+
+
'@vitest/mocker@3.0.6':
+
resolution: {integrity: sha512-KPztr4/tn7qDGZfqlSPQoF2VgJcKxnDNhmfR3VgZ6Fy1bO8T9Fc1stUiTXtqz0yG24VpD00pZP5f8EOFknjNuQ==}
+
peerDependencies:
+
msw: ^2.4.9
+
vite: ^5.0.0 || ^6.0.0
+
peerDependenciesMeta:
+
msw:
+
optional: true
+
vite:
+
optional: true
+
+
'@vitest/pretty-format@3.0.6':
+
resolution: {integrity: sha512-Zyctv3dbNL+67qtHfRnUE/k8qxduOamRfAL1BurEIQSyOEFffoMvx2pnDSSbKAAVxY0Ej2J/GH2dQKI0W2JyVg==}
+
+
'@vitest/runner@3.0.6':
+
resolution: {integrity: sha512-JopP4m/jGoaG1+CBqubV/5VMbi7L+NQCJTu1J1Pf6YaUbk7bZtaq5CX7p+8sY64Sjn1UQ1XJparHfcvTTdu9cA==}
+
+
'@vitest/snapshot@3.0.6':
+
resolution: {integrity: sha512-qKSmxNQwT60kNwwJHMVwavvZsMGXWmngD023OHSgn873pV0lylK7dwBTfYP7e4URy5NiBCHHiQGA9DHkYkqRqg==}
+
+
'@vitest/spy@3.0.6':
+
resolution: {integrity: sha512-HfOGx/bXtjy24fDlTOpgiAEJbRfFxoX3zIGagCqACkFKKZ/TTOE6gYMKXlqecvxEndKFuNHcHqP081ggZ2yM0Q==}
+
+
'@vitest/utils@3.0.6':
+
resolution: {integrity: sha512-18ktZpf4GQFTbf9jK543uspU03Q2qya7ZGya5yiZ0Gx0nnnalBvd5ZBislbl2EhLjM8A8rt4OilqKG7QwcGkvQ==}
+
acorn@8.14.0:
resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==}
engines: {node: '>=0.4.0'}
···
resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
engines: {node: '>= 0.4'}
+
assertion-error@2.0.1:
+
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
+
engines: {node: '>=12'}
+
async-function@1.0.0:
resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
engines: {node: '>= 0.4'}
···
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
+
browserslist@4.25.4:
+
resolution: {integrity: sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
buffer-from@1.1.2:
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+
cac@6.7.14:
+
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+
engines: {node: '>=8'}
call-bind-apply-helpers@1.0.1:
resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==}
···
resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==}
engines: {node: '>= 0.4'}
+
caniuse-lite@1.0.30001737:
+
resolution: {integrity: sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==}
+
+
chai@5.2.0:
+
resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==}
+
engines: {node: '>=12'}
chalk@2.4.2:
resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
···
resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==}
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
chardet@2.1.0:
+
resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==}
+
+
check-error@2.1.1:
+
resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
+
engines: {node: '>= 16'}
ci-info@3.9.0:
resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
···
supports-color:
optional: true
+
debug@4.4.1:
+
resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==}
+
engines: {node: '>=6.0'}
+
peerDependencies:
+
supports-color: '*'
+
peerDependenciesMeta:
+
supports-color:
+
optional: true
+
+
deep-eql@5.0.2:
+
resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
+
engines: {node: '>=6'}
+
deepmerge@4.3.1:
resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
engines: {node: '>=0.10.0'}
···
eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
electron-to-chromium@1.5.211:
+
resolution: {integrity: sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw==}
emoji-regex@10.4.0:
resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
···
es-errors@1.3.0:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
+
+
es-module-lexer@1.6.0:
+
resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==}
es-object-atoms@1.1.1:
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
···
resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
engines: {node: '>= 0.4'}
+
esbuild@0.24.2:
+
resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==}
+
engines: {node: '>=18'}
+
hasBin: true
+
escalade@3.2.0:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
···
estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+
estree-walker@3.0.3:
+
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
eventemitter3@5.0.1:
resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
···
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'}
+
extendable-error@0.1.7:
resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==}
fast-glob@3.3.3:
resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
···
hosted-git-info@2.8.9:
resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
+
human-id@4.1.1:
+
resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==}
+
hasBin: true
human-signals@5.0.0:
resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
engines: {node: '>=16.17.0'}
+
iconv-lite@0.6.3:
+
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
engines: {node: '>=0.10.0'}
ignore@5.3.2:
···
resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==}
engines: {node: '>=18'}
+
loupe@3.1.3:
+
resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==}
+
lru-cache@11.0.2:
resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==}
engines: {node: 20 || >=22}
···
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+
nanoid@3.3.8:
+
resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
+
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+
hasBin: true
nice-try@1.0.5:
resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==}
···
resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
engines: {node: '>=18'}
outdent@0.5.0:
resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==}
···
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'}
+
pathe@2.0.3:
+
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
+
pathval@2.0.0:
+
resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==}
+
engines: {node: '>= 14.16'}
+
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
···
possible-typed-array-names@1.0.0:
resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
engines: {node: '>= 0.4'}
+
+
postcss@8.5.3:
+
resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
+
engines: {node: ^10 || ^12 || >=14}
prettier@2.8.8:
resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
···
resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
engines: {node: '>= 0.4'}
+
siginfo@2.0.0:
+
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+
signal-exit@4.1.0:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'}
···
smob@1.5.0:
resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==}
+
+
source-map-js@1.2.1:
+
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+
engines: {node: '>=0.10.0'}
source-map-support@0.5.21:
resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
···
sprintf-js@1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+
+
stackback@0.0.2:
+
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+
+
std-env@3.8.0:
+
resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==}
string-argv@0.3.2:
resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
···
engines: {node: '>=10'}
hasBin: true
+
tinybench@2.9.0:
+
resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
+
+
tinyexec@0.3.2:
+
resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
+
+
tinypool@1.0.2:
+
resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==}
+
engines: {node: ^18.0.0 || >=20.0.0}
+
+
tinyrainbow@2.0.0:
+
resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==}
+
engines: {node: '>=14.0.0'}
+
+
tinyspy@3.0.2:
+
resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
+
engines: {node: '>=14.0.0'}
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
···
resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
engines: {node: '>= 4.0.0'}
+
update-browserslist-db@1.1.3:
+
resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==}
hasBin: true
peerDependencies:
browserslist: '>= 4.21.0'
···
validate-npm-package-license@3.0.4:
resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
+
vite-node@3.0.6:
+
resolution: {integrity: sha512-s51RzrTkXKJrhNbUzQRsarjmAae7VmMPAsRT7lppVpIg6mK3zGthP9Hgz0YQQKuNcF+Ii7DfYk3Fxz40jRmePw==}
+
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+
hasBin: true
+
+
vite@6.1.1:
+
resolution: {integrity: sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==}
+
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+
hasBin: true
+
peerDependencies:
+
'@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+
jiti: '>=1.21.0'
+
less: '*'
+
lightningcss: ^1.21.0
+
sass: '*'
+
sass-embedded: '*'
+
stylus: '*'
+
sugarss: '*'
+
terser: ^5.16.0
+
tsx: ^4.8.1
+
yaml: ^2.4.2
+
peerDependenciesMeta:
+
'@types/node':
+
optional: true
+
jiti:
+
optional: true
+
less:
+
optional: true
+
lightningcss:
+
optional: true
+
sass:
+
optional: true
+
sass-embedded:
+
optional: true
+
stylus:
+
optional: true
+
sugarss:
+
optional: true
+
terser:
+
optional: true
+
tsx:
+
optional: true
+
yaml:
+
optional: true
+
+
vitest@3.0.6:
+
resolution: {integrity: sha512-/iL1Sc5VeDZKPDe58oGK4HUFLhw6b5XdY1MYawjuSaDA4sEfYlY9HnS6aCEG26fX+MgUi7MwlduTBHHAI/OvMA==}
+
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+
hasBin: true
+
peerDependencies:
+
'@edge-runtime/vm': '*'
+
'@types/debug': ^4.1.12
+
'@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+
'@vitest/browser': 3.0.6
+
'@vitest/ui': 3.0.6
+
happy-dom: '*'
+
jsdom: '*'
+
peerDependenciesMeta:
+
'@edge-runtime/vm':
+
optional: true
+
'@types/debug':
+
optional: true
+
'@types/node':
+
optional: true
+
'@vitest/browser':
+
optional: true
+
'@vitest/ui':
+
optional: true
+
happy-dom:
+
optional: true
+
jsdom:
+
optional: true
+
webidl-conversions@3.0.1:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
···
engines: {node: '>= 8'}
hasBin: true
+
why-is-node-running@2.3.0:
+
resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
+
engines: {node: '>=8'}
+
hasBin: true
+
wrap-ansi@7.0.0:
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
engines: {node: '>=10'}
···
'@ampproject/remapping@2.3.0':
dependencies:
+
'@jridgewell/gen-mapping': 0.3.13
+
'@jridgewell/trace-mapping': 0.3.30
'@babel/code-frame@7.26.2':
dependencies:
···
js-tokens: 4.0.0
picocolors: 1.1.1
+
'@babel/code-frame@7.27.1':
+
dependencies:
+
'@babel/helper-validator-identifier': 7.27.1
+
js-tokens: 4.0.0
+
picocolors: 1.1.1
+
+
'@babel/compat-data@7.28.0': {}
'@babel/core@7.26.7':
dependencies:
'@ampproject/remapping': 2.3.0
+
'@babel/code-frame': 7.27.1
+
'@babel/generator': 7.28.3
+
'@babel/helper-compilation-targets': 7.27.2
+
'@babel/helper-module-transforms': 7.28.3(@babel/core@7.26.7)
+
'@babel/helpers': 7.28.3
+
'@babel/parser': 7.28.3
+
'@babel/template': 7.27.2
+
'@babel/traverse': 7.28.3
+
'@babel/types': 7.28.2
convert-source-map: 2.0.0
+
debug: 4.4.1
gensync: 1.0.0-beta.2
json5: 2.2.3
semver: 6.3.1
···
'@jridgewell/trace-mapping': 0.3.25
jsesc: 3.1.0
+
'@babel/generator@7.28.3':
+
dependencies:
+
'@babel/parser': 7.28.3
+
'@babel/types': 7.28.2
+
'@jridgewell/gen-mapping': 0.3.13
+
'@jridgewell/trace-mapping': 0.3.30
+
jsesc: 3.1.0
+
'@babel/helper-annotate-as-pure@7.25.9':
dependencies:
'@babel/types': 7.26.7
+
'@babel/helper-compilation-targets@7.27.2':
dependencies:
+
'@babel/compat-data': 7.28.0
+
'@babel/helper-validator-option': 7.27.1
+
browserslist: 4.25.4
lru-cache: 5.1.1
semver: 6.3.1
···
semver: 6.3.1
transitivePeerDependencies:
- supports-color
+
+
'@babel/helper-globals@7.28.0': {}
'@babel/helper-member-expression-to-functions@7.25.9':
dependencies:
···
transitivePeerDependencies:
- supports-color
+
'@babel/helper-module-imports@7.27.1':
+
dependencies:
+
'@babel/traverse': 7.28.3
+
'@babel/types': 7.28.2
+
transitivePeerDependencies:
+
- supports-color
+
+
'@babel/helper-module-transforms@7.28.3(@babel/core@7.26.7)':
dependencies:
'@babel/core': 7.26.7
+
'@babel/helper-module-imports': 7.27.1
+
'@babel/helper-validator-identifier': 7.27.1
+
'@babel/traverse': 7.28.3
transitivePeerDependencies:
- supports-color
···
'@babel/helper-string-parser@7.25.9': {}
+
'@babel/helper-string-parser@7.27.1': {}
+
'@babel/helper-validator-identifier@7.25.9': {}
+
'@babel/helper-validator-identifier@7.27.1': {}
+
'@babel/helper-validator-option@7.27.1': {}
+
+
'@babel/helpers@7.28.3':
dependencies:
+
'@babel/template': 7.27.2
+
'@babel/types': 7.28.2
'@babel/parser@7.26.7':
dependencies:
'@babel/types': 7.26.7
+
+
'@babel/parser@7.28.3':
+
dependencies:
+
'@babel/types': 7.28.2
'@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.7)':
dependencies:
···
'@babel/code-frame': 7.26.2
'@babel/parser': 7.26.7
'@babel/types': 7.26.7
+
+
'@babel/template@7.27.2':
+
dependencies:
+
'@babel/code-frame': 7.27.1
+
'@babel/parser': 7.28.3
+
'@babel/types': 7.28.2
'@babel/traverse@7.26.7':
dependencies:
···
transitivePeerDependencies:
- supports-color
+
'@babel/traverse@7.28.3':
+
dependencies:
+
'@babel/code-frame': 7.27.1
+
'@babel/generator': 7.28.3
+
'@babel/helper-globals': 7.28.0
+
'@babel/parser': 7.28.3
+
'@babel/template': 7.27.2
+
'@babel/types': 7.28.2
+
debug: 4.4.1
+
transitivePeerDependencies:
+
- supports-color
+
'@babel/types@7.26.7':
dependencies:
'@babel/helper-string-parser': 7.25.9
'@babel/helper-validator-identifier': 7.25.9
+
'@babel/types@7.28.2':
+
dependencies:
+
'@babel/helper-string-parser': 7.27.1
+
'@babel/helper-validator-identifier': 7.27.1
+
+
'@changesets/apply-release-plan@7.0.12':
dependencies:
+
'@changesets/config': 3.1.1
'@changesets/get-version-range-type': 0.4.0
+
'@changesets/git': 3.0.4
+
'@changesets/should-skip-package': 0.1.2
+
'@changesets/types': 6.1.0
'@manypkg/get-packages': 1.1.3
detect-indent: 6.1.0
fs-extra: 7.0.1
···
resolve-from: 5.0.0
semver: 7.7.0
+
'@changesets/assemble-release-plan@6.0.9':
dependencies:
'@changesets/errors': 0.2.0
+
'@changesets/get-dependents-graph': 2.1.3
+
'@changesets/should-skip-package': 0.1.2
+
'@changesets/types': 6.1.0
'@manypkg/get-packages': 1.1.3
semver: 7.7.0
+
'@changesets/changelog-git@0.2.1':
dependencies:
+
'@changesets/types': 6.1.0
+
'@changesets/cli@2.29.6(@types/node@22.12.0)':
dependencies:
+
'@changesets/apply-release-plan': 7.0.12
+
'@changesets/assemble-release-plan': 6.0.9
+
'@changesets/changelog-git': 0.2.1
+
'@changesets/config': 3.1.1
'@changesets/errors': 0.2.0
+
'@changesets/get-dependents-graph': 2.1.3
+
'@changesets/get-release-plan': 4.0.13
+
'@changesets/git': 3.0.4
'@changesets/logger': 0.1.1
+
'@changesets/pre': 2.0.2
+
'@changesets/read': 0.6.5
+
'@changesets/should-skip-package': 0.1.2
+
'@changesets/types': 6.1.0
+
'@changesets/write': 0.4.0
+
'@inquirer/external-editor': 1.0.1(@types/node@22.12.0)
'@manypkg/get-packages': 1.1.3
ansi-colors: 4.1.3
ci-info: 3.9.0
enquirer: 2.4.1
fs-extra: 7.0.1
mri: 1.2.0
p-limit: 2.3.0
···
semver: 7.7.0
spawndamnit: 3.0.1
term-size: 2.2.1
+
transitivePeerDependencies:
+
- '@types/node'
+
'@changesets/config@3.1.1':
dependencies:
'@changesets/errors': 0.2.0
+
'@changesets/get-dependents-graph': 2.1.3
'@changesets/logger': 0.1.1
+
'@changesets/types': 6.1.0
'@manypkg/get-packages': 1.1.3
fs-extra: 7.0.1
micromatch: 4.0.8
···
dependencies:
extendable-error: 0.1.7
+
'@changesets/get-dependents-graph@2.1.3':
dependencies:
+
'@changesets/types': 6.1.0
'@manypkg/get-packages': 1.1.3
picocolors: 1.1.1
semver: 7.7.0
···
transitivePeerDependencies:
- encoding
+
'@changesets/get-release-plan@4.0.13':
dependencies:
+
'@changesets/assemble-release-plan': 6.0.9
+
'@changesets/config': 3.1.1
+
'@changesets/pre': 2.0.2
+
'@changesets/read': 0.6.5
+
'@changesets/types': 6.1.0
'@manypkg/get-packages': 1.1.3
'@changesets/get-version-range-type@0.4.0': {}
+
'@changesets/git@3.0.4':
dependencies:
'@changesets/errors': 0.2.0
'@manypkg/get-packages': 1.1.3
···
dependencies:
picocolors: 1.1.1
+
'@changesets/parse@0.4.1':
dependencies:
+
'@changesets/types': 6.1.0
js-yaml: 3.14.1
+
'@changesets/pre@2.0.2':
dependencies:
'@changesets/errors': 0.2.0
+
'@changesets/types': 6.1.0
'@manypkg/get-packages': 1.1.3
fs-extra: 7.0.1
+
'@changesets/read@0.6.5':
dependencies:
+
'@changesets/git': 3.0.4
'@changesets/logger': 0.1.1
+
'@changesets/parse': 0.4.1
+
'@changesets/types': 6.1.0
fs-extra: 7.0.1
p-filter: 2.1.0
picocolors: 1.1.1
+
'@changesets/should-skip-package@0.1.2':
dependencies:
+
'@changesets/types': 6.1.0
'@manypkg/get-packages': 1.1.3
'@changesets/types@4.1.0': {}
+
'@changesets/types@6.1.0': {}
+
'@changesets/write@0.4.0':
dependencies:
+
'@changesets/types': 6.1.0
fs-extra: 7.0.1
+
human-id: 4.1.1
prettier: 2.8.8
+
'@esbuild/aix-ppc64@0.24.2':
+
optional: true
+
+
'@esbuild/android-arm64@0.24.2':
+
optional: true
+
+
'@esbuild/android-arm@0.24.2':
+
optional: true
+
+
'@esbuild/android-x64@0.24.2':
+
optional: true
+
+
'@esbuild/darwin-arm64@0.24.2':
+
optional: true
+
+
'@esbuild/darwin-x64@0.24.2':
+
optional: true
+
+
'@esbuild/freebsd-arm64@0.24.2':
+
optional: true
+
+
'@esbuild/freebsd-x64@0.24.2':
+
optional: true
+
+
'@esbuild/linux-arm64@0.24.2':
+
optional: true
+
+
'@esbuild/linux-arm@0.24.2':
+
optional: true
+
+
'@esbuild/linux-ia32@0.24.2':
+
optional: true
+
+
'@esbuild/linux-loong64@0.24.2':
+
optional: true
+
+
'@esbuild/linux-mips64el@0.24.2':
+
optional: true
+
+
'@esbuild/linux-ppc64@0.24.2':
+
optional: true
+
+
'@esbuild/linux-riscv64@0.24.2':
+
optional: true
+
+
'@esbuild/linux-s390x@0.24.2':
+
optional: true
+
+
'@esbuild/linux-x64@0.24.2':
+
optional: true
+
+
'@esbuild/netbsd-arm64@0.24.2':
+
optional: true
+
+
'@esbuild/netbsd-x64@0.24.2':
+
optional: true
+
+
'@esbuild/openbsd-arm64@0.24.2':
+
optional: true
+
+
'@esbuild/openbsd-x64@0.24.2':
+
optional: true
+
+
'@esbuild/sunos-x64@0.24.2':
+
optional: true
+
+
'@esbuild/win32-arm64@0.24.2':
+
optional: true
+
+
'@esbuild/win32-ia32@0.24.2':
+
optional: true
+
+
'@esbuild/win32-x64@0.24.2':
+
optional: true
+
+
'@inquirer/external-editor@1.0.1(@types/node@22.12.0)':
+
dependencies:
+
chardet: 2.1.0
+
iconv-lite: 0.6.3
+
optionalDependencies:
+
'@types/node': 22.12.0
+
'@isaacs/cliui@8.0.2':
dependencies:
string-width: 5.1.2
···
wrap-ansi: 8.1.0
wrap-ansi-cjs: wrap-ansi@7.0.0
+
'@jridgewell/gen-mapping@0.3.13':
+
dependencies:
+
'@jridgewell/sourcemap-codec': 1.5.5
+
'@jridgewell/trace-mapping': 0.3.30
+
'@jridgewell/gen-mapping@0.3.8':
dependencies:
'@jridgewell/set-array': 1.2.1
···
'@jridgewell/sourcemap-codec@1.5.0': {}
+
'@jridgewell/sourcemap-codec@1.5.5': {}
+
'@jridgewell/trace-mapping@0.3.25':
dependencies:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.0
+
+
'@jridgewell/trace-mapping@0.3.30':
+
dependencies:
+
'@jridgewell/resolve-uri': 3.1.2
+
'@jridgewell/sourcemap-codec': 1.5.5
'@manypkg/find-root@1.1.0':
dependencies:
···
'@types/resolve@1.20.2': {}
+
'@vitest/expect@3.0.6':
+
dependencies:
+
'@vitest/spy': 3.0.6
+
'@vitest/utils': 3.0.6
+
chai: 5.2.0
+
tinyrainbow: 2.0.0
+
+
'@vitest/mocker@3.0.6(vite@6.1.1(@types/node@22.12.0)(terser@5.37.0)(yaml@2.7.0))':
+
dependencies:
+
'@vitest/spy': 3.0.6
+
estree-walker: 3.0.3
+
magic-string: 0.30.17
+
optionalDependencies:
+
vite: 6.1.1(@types/node@22.12.0)(terser@5.37.0)(yaml@2.7.0)
+
+
'@vitest/pretty-format@3.0.6':
+
dependencies:
+
tinyrainbow: 2.0.0
+
+
'@vitest/runner@3.0.6':
+
dependencies:
+
'@vitest/utils': 3.0.6
+
pathe: 2.0.3
+
+
'@vitest/snapshot@3.0.6':
+
dependencies:
+
'@vitest/pretty-format': 3.0.6
+
magic-string: 0.30.17
+
pathe: 2.0.3
+
+
'@vitest/spy@3.0.6':
+
dependencies:
+
tinyspy: 3.0.2
+
+
'@vitest/utils@3.0.6':
+
dependencies:
+
'@vitest/pretty-format': 3.0.6
+
loupe: 3.1.3
+
tinyrainbow: 2.0.0
+
acorn@8.14.0: {}
ansi-colors@4.1.3: {}
···
get-intrinsic: 1.2.7
is-array-buffer: 3.0.5
+
assertion-error@2.0.1: {}
+
async-function@1.0.0: {}
available-typed-arrays@1.0.7:
···
dependencies:
fill-range: 7.1.1
+
browserslist@4.25.4:
dependencies:
+
caniuse-lite: 1.0.30001737
+
electron-to-chromium: 1.5.211
node-releases: 2.0.19
+
update-browserslist-db: 1.1.3(browserslist@4.25.4)
buffer-from@1.1.2: {}
+
+
cac@6.7.14: {}
call-bind-apply-helpers@1.0.1:
dependencies:
···
call-bind-apply-helpers: 1.0.1
get-intrinsic: 1.2.7
+
caniuse-lite@1.0.30001737: {}
+
+
chai@5.2.0:
+
dependencies:
+
assertion-error: 2.0.1
+
check-error: 2.1.1
+
deep-eql: 5.0.2
+
loupe: 3.1.3
+
pathval: 2.0.0
chalk@2.4.2:
dependencies:
···
chalk@5.4.1: {}
+
chardet@2.1.0: {}
+
+
check-error@2.1.1: {}
ci-info@3.9.0: {}
···
dependencies:
ms: 2.1.3
+
debug@4.4.1:
+
dependencies:
+
ms: 2.1.3
+
+
deep-eql@5.0.2: {}
+
deepmerge@4.3.1: {}
define-data-property@1.1.4:
···
eastasianwidth@0.2.0: {}
+
electron-to-chromium@1.5.211: {}
emoji-regex@10.4.0: {}
···
es-errors@1.3.0: {}
+
es-module-lexer@1.6.0: {}
+
es-object-atoms@1.1.1:
dependencies:
es-errors: 1.3.0
···
is-date-object: 1.1.0
is-symbol: 1.1.1
+
esbuild@0.24.2:
+
optionalDependencies:
+
'@esbuild/aix-ppc64': 0.24.2
+
'@esbuild/android-arm': 0.24.2
+
'@esbuild/android-arm64': 0.24.2
+
'@esbuild/android-x64': 0.24.2
+
'@esbuild/darwin-arm64': 0.24.2
+
'@esbuild/darwin-x64': 0.24.2
+
'@esbuild/freebsd-arm64': 0.24.2
+
'@esbuild/freebsd-x64': 0.24.2
+
'@esbuild/linux-arm': 0.24.2
+
'@esbuild/linux-arm64': 0.24.2
+
'@esbuild/linux-ia32': 0.24.2
+
'@esbuild/linux-loong64': 0.24.2
+
'@esbuild/linux-mips64el': 0.24.2
+
'@esbuild/linux-ppc64': 0.24.2
+
'@esbuild/linux-riscv64': 0.24.2
+
'@esbuild/linux-s390x': 0.24.2
+
'@esbuild/linux-x64': 0.24.2
+
'@esbuild/netbsd-arm64': 0.24.2
+
'@esbuild/netbsd-x64': 0.24.2
+
'@esbuild/openbsd-arm64': 0.24.2
+
'@esbuild/openbsd-x64': 0.24.2
+
'@esbuild/sunos-x64': 0.24.2
+
'@esbuild/win32-arm64': 0.24.2
+
'@esbuild/win32-ia32': 0.24.2
+
'@esbuild/win32-x64': 0.24.2
+
escalade@3.2.0: {}
escape-string-regexp@1.0.5: {}
···
esprima@4.0.1: {}
estree-walker@2.0.2: {}
+
+
estree-walker@3.0.3:
+
dependencies:
+
'@types/estree': 1.0.6
eventemitter3@5.0.1: {}
···
signal-exit: 4.1.0
strip-final-newline: 3.0.0
+
expect-type@1.1.0: {}
+
extendable-error@0.1.7: {}
fast-glob@3.3.3:
dependencies:
···
hosted-git-info@2.8.9: {}
+
human-id@4.1.1: {}
human-signals@5.0.0: {}
+
iconv-lite@0.6.3:
dependencies:
safer-buffer: 2.1.2
···
strip-ansi: 7.1.0
wrap-ansi: 9.0.0
+
loupe@3.1.3: {}
+
lru-cache@11.0.2: {}
lru-cache@5.1.1:
···
mri@1.2.0: {}
ms@2.1.3: {}
+
+
nanoid@3.3.8: {}
nice-try@1.0.5: {}
···
dependencies:
mimic-function: 5.0.1
outdent@0.5.0: {}
own-keys@1.0.1:
···
path-type@4.0.0: {}
+
pathe@2.0.3: {}
+
+
pathval@2.0.0: {}
+
picocolors@1.1.1: {}
picomatch@2.3.1: {}
···
pify@4.0.1: {}
possible-typed-array-names@1.0.0: {}
+
+
postcss@8.5.3:
+
dependencies:
+
nanoid: 3.3.8
+
picocolors: 1.1.1
+
source-map-js: 1.2.1
prettier@2.8.8: {}
···
side-channel-map: 1.0.1
side-channel-weakmap: 1.0.2
+
siginfo@2.0.0: {}
+
signal-exit@4.1.0: {}
slash@3.0.0: {}
···
is-fullwidth-code-point: 5.0.0
smob@1.5.0: {}
+
+
source-map-js@1.2.1: {}
source-map-support@0.5.21:
dependencies:
···
spdx-license-ids@3.0.21: {}
sprintf-js@1.0.3: {}
+
+
stackback@0.0.2: {}
+
+
std-env@3.8.0: {}
string-argv@0.3.2: {}
···
commander: 2.20.3
source-map-support: 0.5.21
+
tinybench@2.9.0: {}
+
+
tinyexec@0.3.2: {}
+
+
tinypool@1.0.2: {}
+
+
tinyrainbow@2.0.0: {}
+
+
tinyspy@3.0.2: {}
to-regex-range@5.0.1:
dependencies:
···
universalify@0.1.2: {}
+
update-browserslist-db@1.1.3(browserslist@4.25.4):
dependencies:
+
browserslist: 4.25.4
escalade: 3.2.0
picocolors: 1.1.1
···
spdx-correct: 3.2.0
spdx-expression-parse: 3.0.1
+
vite-node@3.0.6(@types/node@22.12.0)(terser@5.37.0)(yaml@2.7.0):
+
dependencies:
+
cac: 6.7.14
+
debug: 4.4.0
+
es-module-lexer: 1.6.0
+
pathe: 2.0.3
+
vite: 6.1.1(@types/node@22.12.0)(terser@5.37.0)(yaml@2.7.0)
+
transitivePeerDependencies:
+
- '@types/node'
+
- jiti
+
- less
+
- lightningcss
+
- sass
+
- sass-embedded
+
- stylus
+
- sugarss
+
- supports-color
+
- terser
+
- tsx
+
- yaml
+
+
vite@6.1.1(@types/node@22.12.0)(terser@5.37.0)(yaml@2.7.0):
+
dependencies:
+
esbuild: 0.24.2
+
postcss: 8.5.3
+
rollup: 4.32.1
+
optionalDependencies:
+
'@types/node': 22.12.0
+
fsevents: 2.3.3
+
terser: 5.37.0
+
yaml: 2.7.0
+
+
vitest@3.0.6(@types/node@22.12.0)(terser@5.37.0)(yaml@2.7.0):
+
dependencies:
+
'@vitest/expect': 3.0.6
+
'@vitest/mocker': 3.0.6(vite@6.1.1(@types/node@22.12.0)(terser@5.37.0)(yaml@2.7.0))
+
'@vitest/pretty-format': 3.0.6
+
'@vitest/runner': 3.0.6
+
'@vitest/snapshot': 3.0.6
+
'@vitest/spy': 3.0.6
+
'@vitest/utils': 3.0.6
+
chai: 5.2.0
+
debug: 4.4.0
+
expect-type: 1.1.0
+
magic-string: 0.30.17
+
pathe: 2.0.3
+
std-env: 3.8.0
+
tinybench: 2.9.0
+
tinyexec: 0.3.2
+
tinypool: 1.0.2
+
tinyrainbow: 2.0.0
+
vite: 6.1.1(@types/node@22.12.0)(terser@5.37.0)(yaml@2.7.0)
+
vite-node: 3.0.6(@types/node@22.12.0)(terser@5.37.0)(yaml@2.7.0)
+
why-is-node-running: 2.3.0
+
optionalDependencies:
+
'@types/node': 22.12.0
+
transitivePeerDependencies:
+
- jiti
+
- less
+
- lightningcss
+
- msw
+
- sass
+
- sass-embedded
+
- stylus
+
- sugarss
+
- supports-color
+
- terser
+
- tsx
+
- yaml
+
webidl-conversions@3.0.1: {}
whatwg-url@5.0.0:
···
which@2.0.2:
dependencies:
isexe: 2.0.0
+
+
why-is-node-running@2.3.0:
+
dependencies:
+
siginfo: 2.0.0
+
stackback: 0.0.2
wrap-ansi@7.0.0:
dependencies:
+213
src/__tests__/network.test.ts
···
···
+
import os from 'node:os';
+
import { vi, describe, it, expect } from 'vitest';
+
import {
+
parseMacStr,
+
parseIpStr,
+
toIpStr,
+
interfaceAssignments,
+
matchAssignment,
+
isSameSubnet,
+
} from '../network';
+
+
describe(parseMacStr, () => {
+
it('parses valid MAC addresses', () => {
+
expect(parseMacStr('11:22:33:44:55:66')).toEqual([17, 34, 51, 68, 85, 102]);
+
});
+
});
+
+
describe(parseIpStr, () => {
+
it('parses valid IP addresses', () => {
+
expect(parseIpStr('0.0.0.0').toString(16)).toBe('0');
+
expect(parseIpStr('1.1.1.1').toString(16)).toBe('1010101');
+
expect(parseIpStr('255.255.255.255').toString(16)).toBe('-1');
+
expect(parseIpStr('100.1.2.3').toString(16)).toBe('64010203');
+
});
+
});
+
+
describe(toIpStr, () => {
+
it.each([['0.0.0.0'], ['1.1.1.1'], ['255.255.255.255'], ['100.1.2.3']])(
+
'stringifies parsed IP (%s)',
+
addr => {
+
expect(toIpStr(parseIpStr(addr))).toBe(addr);
+
}
+
);
+
});
+
+
describe(isSameSubnet, () => {
+
it('returns true for same subnet', () => {
+
expect(isSameSubnet('192.168.1.1', '192.168.1.2', '255.255.255.0')).toBe(
+
true
+
);
+
});
+
it('returns false for different subnet', () => {
+
expect(isSameSubnet('192.168.1.1', '192.168.2.1', '255.255.255.0')).toBe(
+
false
+
);
+
});
+
});
+
+
describe(interfaceAssignments, () => {
+
const networkInterfaces = vi
+
.spyOn(os, 'networkInterfaces')
+
.mockReturnValue([] as any);
+
+
it('returns sorted list of assignments', () => {
+
networkInterfaces.mockReturnValueOnce({
+
lo0: [
+
{
+
address: '127.0.0.1',
+
netmask: '255.0.0.0',
+
family: 'IPv4',
+
mac: '00:00:00:00:00:00',
+
internal: true,
+
cidr: '',
+
},
+
],
+
en1: [
+
{
+
address: '10.0.0.10',
+
netmask: '255.255.255.0',
+
family: 'IPv4',
+
mac: '00:00:00:00:00:00',
+
internal: false,
+
cidr: '',
+
},
+
],
+
tun2: [
+
{
+
address: '100.0.0.11',
+
netmask: '255.255.255.0',
+
family: 'IPv4',
+
mac: '00:00:00:00:00:00',
+
internal: true,
+
cidr: '',
+
},
+
],
+
});
+
expect(interfaceAssignments()).toMatchInlineSnapshot(`
+
[
+
{
+
"address": "10.0.0.10",
+
"cidr": "",
+
"family": "IPv4",
+
"iname": "en1",
+
"internal": false,
+
"mac": "00:00:00:00:00:00",
+
"netmask": "255.255.255.0",
+
},
+
{
+
"address": "100.0.0.11",
+
"cidr": "",
+
"family": "IPv4",
+
"iname": "tun2",
+
"internal": true,
+
"mac": "00:00:00:00:00:00",
+
"netmask": "255.255.255.0",
+
},
+
{
+
"address": "127.0.0.1",
+
"cidr": "",
+
"family": "IPv4",
+
"iname": "lo0",
+
"internal": true,
+
"mac": "00:00:00:00:00:00",
+
"netmask": "255.0.0.0",
+
},
+
]
+
`);
+
});
+
+
it('deprioritizes bridge interfaces', () => {
+
networkInterfaces.mockReturnValueOnce({
+
bridge0: [
+
{
+
address: '100.0.0.11',
+
netmask: '255.255.255.0',
+
family: 'IPv4',
+
mac: '10:00:00:00:00:00',
+
internal: false,
+
cidr: '',
+
},
+
],
+
en1: [
+
{
+
address: '10.0.0.10',
+
netmask: '255.255.255.0',
+
family: 'IPv4',
+
mac: '10:00:00:00:00:00',
+
internal: false,
+
cidr: '',
+
},
+
],
+
});
+
expect(interfaceAssignments()).toMatchInlineSnapshot(`
+
[
+
{
+
"address": "10.0.0.10",
+
"cidr": "",
+
"family": "IPv4",
+
"iname": "en1",
+
"internal": false,
+
"mac": "10:00:00:00:00:00",
+
"netmask": "255.255.255.0",
+
},
+
{
+
"address": "100.0.0.11",
+
"cidr": "",
+
"family": "IPv4",
+
"iname": "bridge0",
+
"internal": false,
+
"mac": "10:00:00:00:00:00",
+
"netmask": "255.255.255.0",
+
},
+
]
+
`);
+
});
+
});
+
+
describe(matchAssignment, () => {
+
it('returns matching assignment by address', () => {
+
const assignment = {
+
iname: 'en0',
+
address: '100.0.0.11',
+
netmask: '255.255.255.0',
+
family: 'IPv4',
+
mac: '00:00:00:00:00:00',
+
internal: true,
+
cidr: '',
+
} as const;
+
expect(matchAssignment([assignment], '100.0.0.11')).toEqual({
+
...assignment,
+
gateway: null,
+
});
+
});
+
+
it('returns matching assignment by gateway', () => {
+
const assignment = {
+
iname: 'en0',
+
address: '100.0.0.11',
+
netmask: '255.255.255.0',
+
family: 'IPv4',
+
mac: '00:00:00:00:00:00',
+
internal: true,
+
cidr: '',
+
} as const;
+
expect(matchAssignment([assignment], '100.0.0.1')).toEqual({
+
...assignment,
+
gateway: '100.0.0.1',
+
});
+
});
+
+
it('returns null otherwise', () => {
+
const assignment = {
+
iname: 'en0',
+
address: '10.0.0.1',
+
netmask: '255.255.255.0',
+
family: 'IPv4',
+
mac: '00:00:00:00:00:00',
+
internal: true,
+
cidr: '',
+
} as const;
+
expect(matchAssignment([assignment], '100.0.0.1')).toBe(null);
+
});
+
});
+148
src/cli.ts
···
···
+
#!/usr/bin/env node
+
+
import type { GatewayAssignment } from './types';
+
import {
+
DEFAULT_ASSIGNMENT,
+
interfaceAssignments,
+
matchAssignment,
+
} from './network';
+
import { probeDefaultRoute } from './route';
+
import { dhcpDiscover } from './dhcp';
+
import { lanNetwork } from './index';
+
+
type Mode = 'help' | 'dhcp' | 'probe' | 'fallback' | 'default';
+
+
function help() {
+
const output = [
+
"Discover the machine's default gateway and local network IP (test utility)",
+
'',
+
'Usage',
+
' $ lan-network',
+
' $ lan-network --default',
+
'',
+
'Modes',
+
' --probe Discover gateway via UDP4 socket to publicly routed address',
+
' --dhcp Discover gateway via DHCPv4 discover broadcast',
+
' --fallback Return highest-priority IPv4 network interface assignment',
+
' --default Try the three above modes in order',
+
' --help Print help output',
+
].join('\n');
+
console.log(output);
+
}
+
+
async function dhcp() {
+
const assignments = interfaceAssignments();
+
if (!assignments.length) {
+
console.error('No available network interface assignments');
+
process.exit(1);
+
}
+
const discoveries = await Promise.allSettled(
+
assignments.map(assignment => {
+
// For each assignment, we send a DHCPDISCOVER packet to its network mask
+
return dhcpDiscover(assignment);
+
})
+
);
+
let assignment: GatewayAssignment | null = null;
+
for (const discovery of discoveries) {
+
// The first discovered gateway is returned, if it matches an assignment
+
if (discovery.status === 'fulfilled' && discovery.value) {
+
const dhcpRoute = discovery.value;
+
if ((assignment = matchAssignment(assignments, dhcpRoute))) {
+
break;
+
}
+
}
+
}
+
if (assignment && assignment !== DEFAULT_ASSIGNMENT) {
+
console.log(JSON.stringify(assignment, null, 2));
+
process.exit(0);
+
} else {
+
console.error('No DHCP router was discoverable');
+
process.exit(1);
+
}
+
}
+
+
async function probe() {
+
const assignments = interfaceAssignments();
+
if (!assignments.length) {
+
console.error('No available network interface assignments');
+
process.exit(1);
+
}
+
try {
+
const defaultRoute = await probeDefaultRoute();
+
const assignment = matchAssignment(assignments, defaultRoute);
+
if (assignment && assignment !== DEFAULT_ASSIGNMENT) {
+
console.log(JSON.stringify(assignment, null, 2));
+
process.exit(0);
+
} else {
+
console.error('No default gateway or route');
+
process.exit(1);
+
}
+
} catch (error) {
+
console.error('No default gateway or route');
+
console.error(error);
+
process.exit(1);
+
}
+
}
+
+
async function fallback() {
+
const assignments = interfaceAssignments();
+
if (!assignments.length) {
+
console.error('No available network interface assignments');
+
process.exit(1);
+
}
+
const assignment = { ...assignments[0], gateway: null };
+
console.log(JSON.stringify(assignment, null, 2));
+
process.exit(0);
+
}
+
+
async function main() {
+
const assignment = await lanNetwork();
+
if (assignment !== DEFAULT_ASSIGNMENT) {
+
console.log(JSON.stringify(assignment, null, 2));
+
process.exit(0);
+
} else {
+
console.error('No default gateway, route, or DHCP router');
+
process.exit(1);
+
}
+
}
+
+
function cli() {
+
let mode: Mode = 'default';
+
parseArgs: for (let i = 1; i < process.argv.length; i++) {
+
const arg = process.argv[i].trim().toLowerCase();
+
switch (arg) {
+
case '-h':
+
case '--help':
+
mode = 'help';
+
break parseArgs;
+
case '-d':
+
case '--dhcp':
+
mode = 'dhcp';
+
break;
+
case '-p':
+
case '--probe':
+
mode = 'probe';
+
break;
+
case '-f':
+
case '--fallback':
+
mode = 'fallback';
+
break;
+
default:
+
if (arg.startsWith('-')) throw new TypeError(`Invalid flag: ${arg}`);
+
}
+
}
+
switch (mode) {
+
case 'help':
+
return help();
+
case 'dhcp':
+
return dhcp();
+
case 'probe':
+
return probe();
+
case 'fallback':
+
return fallback();
+
case 'default':
+
return main();
+
}
+
}
+
+
cli();
+8 -2
src/dhcp.ts
···
import { randomBytes } from 'node:crypto';
import { createSocket } from 'node:dgram';
-
import { parseIpStr, toIpStr, parseMacStr } from './network';
import type { NetworkAssignment } from './types';
class DHCPTimeoutError extends TypeError {
···
const socket = createSocket(
{ type: 'udp4', reuseAddr: true },
(_msg, rinfo) => {
clearTimeout(timeout);
resolve(rinfo.address);
socket.close();
···
socket.close();
socket.unref();
});
-
socket.bind(DHCP_CLIENT_PORT, assignment.address, () => {
socket.setBroadcast(true);
socket.setSendBufferSize(packet.length);
socket.send(
···
import { randomBytes } from 'node:crypto';
import { createSocket } from 'node:dgram';
+
import { parseIpStr, toIpStr, parseMacStr, isSameSubnet } from './network';
import type { NetworkAssignment } from './types';
class DHCPTimeoutError extends TypeError {
···
const socket = createSocket(
{ type: 'udp4', reuseAddr: true },
(_msg, rinfo) => {
+
if (
+
!isSameSubnet(rinfo.address, assignment.address, assignment.netmask)
+
) {
+
return;
+
}
+
clearTimeout(timeout);
resolve(rinfo.address);
socket.close();
···
socket.close();
socket.unref();
});
+
socket.bind(DHCP_CLIENT_PORT, () => {
socket.setBroadcast(true);
socket.setSendBufferSize(packet.length);
socket.send(
+10 -13
src/index.ts
···
import { spawnSync } from 'child_process';
import { dhcpDiscover } from './dhcp';
import { probeDefaultRoute } from './route';
-
import { interfaceAssignments, matchAssignment } from './network';
import type { GatewayAssignment } from './types';
-
-
const DEFAULT_ASSIGNMENT: GatewayAssignment = {
-
iname: 'lo0',
-
address: '127.0.0.1',
-
netmask: '255.0.0.0',
-
family: 'IPv4',
-
mac: '00:00:00:00:00:00',
-
internal: true,
-
cidr: '127.0.0.1/8',
-
gateway: null,
-
};
export async function lanNetwork(): Promise<GatewayAssignment> {
// Get IPv4 network assignments, sorted by:
···
try {
const defaultRoute = await probeDefaultRoute();
// If this route matches a known assignment, return it without a gateway
-
if ((assignment = matchAssignment(assignments, defaultRoute))) {
return assignment;
}
} catch {
···
import { spawnSync } from 'child_process';
import { dhcpDiscover } from './dhcp';
import { probeDefaultRoute } from './route';
+
import {
+
DEFAULT_ASSIGNMENT,
+
interfaceAssignments,
+
matchAssignment,
+
isInternal,
+
} from './network';
import type { GatewayAssignment } from './types';
export async function lanNetwork(): Promise<GatewayAssignment> {
// Get IPv4 network assignments, sorted by:
···
try {
const defaultRoute = await probeDefaultRoute();
// If this route matches a known assignment, return it without a gateway
+
if (
+
(assignment = matchAssignment(assignments, defaultRoute)) &&
+
!isInternal(assignment)
+
) {
return assignment;
}
} catch {
+47 -3
src/network.ts
···
-
import { networkInterfaces } from 'node:os';
import type { GatewayAssignment, NetworkAssignment } from './types';
export const parseMacStr = (macStr: string): number[] =>
macStr
···
return addr[3] | (addr[2] << 8) | (addr[1] << 16) | (addr[0] << 24);
};
export const toIpStr = (addr: number): string => {
const MASK = (1 << 8) - 1;
let ipStr = '';
···
else return 0;
};
export const interfaceAssignments = (): NetworkAssignment[] => {
const candidates: NetworkAssignment[] = [];
-
const interfaces = networkInterfaces();
for (const iname in interfaces) {
const assignments = interfaces[iname];
if (!assignments) continue;
···
// Prioritise external interfaces, then sort by priority,
// when priority is equal, sort by raw IP values
const sortBy =
-
+a.internal - +b.internal ||
priorityB - priorityA ||
parseIpStr(b.address) - parseIpStr(a.address);
return sortBy;
···
+
import os from 'node:os';
import type { GatewayAssignment, NetworkAssignment } from './types';
+
+
export const DEFAULT_ASSIGNMENT: GatewayAssignment = {
+
iname: 'lo0',
+
address: '127.0.0.1',
+
netmask: '255.0.0.0',
+
family: 'IPv4',
+
mac: '00:00:00:00:00:00',
+
internal: true,
+
cidr: '127.0.0.1/8',
+
gateway: null,
+
};
export const parseMacStr = (macStr: string): number[] =>
macStr
···
return addr[3] | (addr[2] << 8) | (addr[1] << 16) | (addr[0] << 24);
};
+
export const isSameSubnet = (
+
addrA: string,
+
addrB: string,
+
netmask: string
+
): boolean => {
+
const rawAddrA = parseIpStr(addrA);
+
const rawAddrB = parseIpStr(addrB);
+
const rawMask = parseIpStr(netmask);
+
return (rawAddrA & rawMask) === (rawAddrB & rawMask);
+
};
+
export const toIpStr = (addr: number): string => {
const MASK = (1 << 8) - 1;
let ipStr = '';
···
else return 0;
};
+
/** Determines if an assignment is internal (indicated by the flag or by a zeroed mac address) */
+
export const isInternal = (assignment: NetworkAssignment) => {
+
if (assignment.internal) {
+
return true;
+
}
+
const mac = parseMacStr(assignment.mac);
+
if (mac.every(x => !x)) {
+
return true;
+
} else if (mac[0] === 0 && mac[1] === 21 && mac[2] === 93) {
+
// NOTE(@kitten): Microsoft virtual interface
+
return true;
+
} else if (
+
assignment.iname.includes('vEthernet') ||
+
/^bridge\d+$/.test(assignment.iname)
+
) {
+
// NOTE(@kitten): Other Windows virtual interfaces, or Linux bridge interfaces
+
return true;
+
} else {
+
return false;
+
}
+
};
+
export const interfaceAssignments = (): NetworkAssignment[] => {
const candidates: NetworkAssignment[] = [];
+
const interfaces = os.networkInterfaces();
for (const iname in interfaces) {
const assignments = interfaces[iname];
if (!assignments) continue;
···
// Prioritise external interfaces, then sort by priority,
// when priority is equal, sort by raw IP values
const sortBy =
+
+isInternal(a) - +isInternal(b) ||
priorityB - priorityA ||
parseIpStr(b.address) - parseIpStr(a.address);
return sortBy;
+3 -3
src/route.ts
···
import { createSocket } from 'dgram';
-
const NOOP_PORT = 65535;
-
const NOOP_IP = '255.255.255.255';
const NO_ROUTE_IP = '0.0.0.0';
class DefaultRouteError extends TypeError {
···
socket.close();
socket.unref();
});
-
socket.connect(NOOP_PORT, NOOP_IP, () => {
const address = socket.address();
if (address && 'address' in address && address.address !== NO_ROUTE_IP) {
resolve(address.address);
···
import { createSocket } from 'dgram';
+
const PROBE_PORT = 53;
+
const PROBE_IP = '1.1.1.1';
const NO_ROUTE_IP = '0.0.0.0';
class DefaultRouteError extends TypeError {
···
socket.close();
socket.unref();
});
+
socket.connect(PROBE_PORT, PROBE_IP, () => {
const address = socket.address();
if (address && 'address' in address && address.address !== NO_ROUTE_IP) {
resolve(address.address);