diff --git a/.github/labeler.yml b/.github/labeler.yml index fafe5e563..2165709ca 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,54 +1,59 @@ -# Add 'core' label to any change within the 'core' package core: - - packages/vrender/** + - changed-files: + - any-glob-to-any-file: 'packages/vrender/**' -# Add 'react' label to any change within the 'core' package react: - - packages/react-vrender/** + - changed-files: + - any-glob-to-any-file: 'packages/react-vrender/**' -# Add 'hierarchy' label to any change within the 'core' package react-utils: - - packages/react-vrender-utils/** + - changed-files: + - any-glob-to-any-file: 'packages/react-vrender-utils/**' -# Add 'projection' label to any change within the 'core' package components: - - packages/vrender-components/** + - changed-files: + - any-glob-to-any-file: 'packages/vrender-components/**' -# Add 'sankey' label to any change within the 'core' package kits: - - packages/vrender-kits/** + - changed-files: + - any-glob-to-any-file: 'packages/vrender-kits/**' -# Add 'test' label to any change to packages/*/__tests__/* files within the source dir test: - - packages/*/__tests__/* + - changed-files: + - any-glob-to-any-file: 'packages/*/__tests__/*' -# Add 'docs' label to any change to docs/ files within the source dir docs: - - docs/** + - changed-files: + - any-glob-to-any-file: 'docs/**' -# Add 'eslint' label to any change to docs/ files within the source dir eslint: - - share/eslint-config/** - - packages/*/.eslintrc.js + - changed-files: + - any-glob-to-any-file: + - 'share/eslint-config/**' + - 'packages/*/.eslintrc.js' -# Add 'jest' label to any change to docs/ files within the source dir jest: - - share/jest-config/** - - packages/*/jest.config.js + - changed-files: + - any-glob-to-any-file: + - 'share/jest-config/**' + - 'packages/*/jest.config.js' -# Add 'typescript' label to any change to docs/ files within the source dir typescript: - - share/ts-config/** - - packages/*/tsconfig.json - - packages/*/tsconfig.eslint.json + - changed-files: + - any-glob-to-any-file: + - 'share/ts-config/**' + - 'packages/*/tsconfig.json' + - 'packages/*/tsconfig.eslint.json' -# Add 'bundler' label to any change to tools/bunder/** files within the source dir bundler: - - tools/bundler/** - - packages/*/bundler.config.js + - changed-files: + - any-glob-to-any-file: + - 'tools/bundler/**' + - 'packages/*/bundler.config.js' -# Add 'chore' label to any change to common/** files within the source dir chore: - - common/autoinstallers/** - - common/git-hooks/** - - common/scripts/** + - changed-files: + - any-glob-to-any-file: + - 'common/autoinstallers/**' + - 'common/git-hooks/**' + - 'common/scripts/**' diff --git a/.github/workflows/bug-server.yml b/.github/workflows/bug-server.yml index db01316e4..6f2002701 100644 --- a/.github/workflows/bug-server.yml +++ b/.github/workflows/bug-server.yml @@ -11,17 +11,12 @@ jobs: build: runs-on: ubuntu-latest - strategy: - matrix: - node-version: [18.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - steps: - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + - name: Use Node.js 24.x + uses: actions/setup-node@v4 with: - node-version: ${{ matrix.node-version }} + node-version: 24.x cache: 'npm' cache-dependency-path: './common/config/rush/pnpm-lock.yaml' diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml index c6b4e6a92..ea5bd017e 100644 --- a/.github/workflows/pr-check.yml +++ b/.github/workflows/pr-check.yml @@ -8,17 +8,12 @@ jobs: build: runs-on: ubuntu-latest - strategy: - matrix: - node-version: [20.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - steps: - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + - name: Use Node.js 24.x + uses: actions/setup-node@v4 with: - node-version: ${{ matrix.node-version }} + node-version: 24.x cache: 'npm' cache-dependency-path: './common/config/rush/pnpm-lock.yaml' diff --git a/.github/workflows/release-changelog.yml b/.github/workflows/release-changelog.yml index 30586af15..46a6ab8da 100644 --- a/.github/workflows/release-changelog.yml +++ b/.github/workflows/release-changelog.yml @@ -11,7 +11,7 @@ jobs: strategy: matrix: - node-version: [18.x] + node-version: [24.x] steps: - name: Checkout @@ -22,7 +22,7 @@ jobs: git config user.email ${{ github.actor }}@users.noreply.github.com - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: 'npm' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ee2fe1725..232dfa330 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,7 +19,7 @@ jobs: strategy: matrix: - node-version: [20.x] + node-version: [24.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: diff --git a/.github/workflows/sync-main-to-develop.yml b/.github/workflows/sync-main-to-develop.yml index 78c57fb41..5762715f8 100644 --- a/.github/workflows/sync-main-to-develop.yml +++ b/.github/workflows/sync-main-to-develop.yml @@ -19,7 +19,7 @@ jobs: strategy: matrix: - node-version: [18.x] + node-version: [24.x] steps: - uses: actions/checkout@v3 @@ -28,7 +28,7 @@ jobs: git config user.email ${{ github.actor }}@users.noreply.github.com - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: 'npm' diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index ba4ace86a..4cecc9e9c 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -12,17 +12,12 @@ jobs: runs-on: - macos-latest - strategy: - matrix: - node-version: [18.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - steps: - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + - name: Use Node.js 24.x + uses: actions/setup-node@v4 with: - node-version: ${{ matrix.node-version }} + node-version: 24.x cache: 'npm' cache-dependency-path: './common/config/rush/pnpm-lock.yaml' diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f668a5b43..0a97237ce 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -62,7 +62,14 @@ The core team is monitoring for pull requests. We will review your pull request ## Development Workflow -After cloning VRender, run `rush update --full` to fetch its dependencies. Then, you can run several commands: +VRender development is verified against Node.js `20`, `22`, and `24`. We recommend using Node.js `24` for day-to-day local development. + +If you switch between Node.js major versions, make sure to rebuild native dependencies such as `canvas`: + +1. `node common/scripts/install-run-rush.js purge` +2. `node common/scripts/install-run-rush.js install --bypass-policy` + +After cloning VRender, run `node common/scripts/install-run-rush.js update --bypass-policy` to fetch its dependencies. Then, you can run several commands: 1. `rush run -p @internal/dev-demos -s start` runs VRender test page locally. 2. `rush eslint` checks the code style. diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 7e4d6a780..e848d9ec4 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -14,7 +14,7 @@ importers: dependencies: '@arco-design/web-react': specifier: 2.46.1 - version: 2.46.1(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.46.1(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@visactor/vchart': specifier: 1.3.0 version: 1.3.0 @@ -26,10 +26,10 @@ importers: version: link:../packages/vrender '@visactor/vutils': specifier: ~1.0.12 - version: 1.0.12 + version: 1.0.23 axios: specifier: ^1.4.0 - version: 1.8.4 + version: 1.14.0 highlight.js: specifier: ^11.8.0 version: 11.11.1 @@ -57,13 +57,13 @@ importers: version: 13.0.9 '@types/react': specifier: ^18.0.0 - version: 18.3.20 + version: 18.3.28 '@types/react-dom': specifier: ^18.0.0 - version: 18.3.5(@types/react@18.3.20) + version: 18.3.7(@types/react@18.3.28) '@vitejs/plugin-react': specifier: 3.1.0 - version: 3.1.0(vite@3.2.6(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1)) + version: 3.1.0(vite@3.2.6(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1)) chalk: specifier: ^3.0.0 version: 3.0.0 @@ -87,7 +87,7 @@ importers: version: 4.9.5 vite: specifier: 3.2.6 - version: 3.2.6(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1) + version: 3.2.6(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1) yargs: specifier: ^17.1.1 version: 17.7.2 @@ -99,7 +99,7 @@ importers: version: link:../vrender '@visactor/vutils': specifier: ~1.0.12 - version: 1.0.12 + version: 1.0.23 react-reconciler: specifier: ^0.29.0 version: 0.29.2(react@18.3.1) @@ -121,16 +121,16 @@ importers: version: 1.1.4 '@types/react': specifier: ^18.0.0 - version: 18.3.20 + version: 18.3.28 '@types/react-dom': specifier: ^18.0.0 - version: 18.3.5(@types/react@18.3.20) + version: 18.3.7(@types/react@18.3.28) '@types/react-reconciler': specifier: ^0.28.2 - version: 0.28.9(@types/react@18.3.20) + version: 0.28.9(@types/react@18.3.28) '@vitejs/plugin-react': specifier: 3.1.0 - version: 3.1.0(vite@3.2.6(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1)) + version: 3.1.0(vite@3.2.6(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -148,7 +148,7 @@ importers: version: 4.9.5 vite: specifier: 3.2.6 - version: 3.2.6(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1) + version: 3.2.6(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1) ../../packages/react-vrender-utils: dependencies: @@ -160,7 +160,7 @@ importers: version: link:../vrender '@visactor/vutils': specifier: ~1.0.12 - version: 1.0.12 + version: 1.0.23 react-reconciler: specifier: ^0.29.0 version: 0.29.2(react@18.3.1) @@ -182,13 +182,13 @@ importers: version: 1.1.4 '@types/react': specifier: ^18.0.0 - version: 18.3.20 + version: 18.3.28 '@types/react-dom': specifier: ^18.0.0 - version: 18.3.5(@types/react@18.3.20) + version: 18.3.7(@types/react@18.3.28) '@vitejs/plugin-react': specifier: 3.1.0 - version: 3.1.0(vite@3.2.6(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1)) + version: 3.1.0(vite@3.2.6(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -206,7 +206,7 @@ importers: version: 4.9.5 vite: specifier: 3.2.6 - version: 3.2.6(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1) + version: 3.2.6(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1) ../../packages/vrender: dependencies: @@ -240,16 +240,16 @@ importers: version: 26.0.24 '@types/react': specifier: ^18.0.0 - version: 18.3.20 + version: 18.3.28 '@types/react-dom': specifier: ^18.0.0 - version: 18.3.5(@types/react@18.3.20) + version: 18.3.7(@types/react@18.3.28) '@visactor/vutils': specifier: ~1.0.12 - version: 1.0.12 + version: 1.0.23 '@vitejs/plugin-react': specifier: 3.1.0 - version: 3.1.0(vite@3.2.6(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1)) + version: 3.1.0(vite@3.2.6(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1)) canvas: specifier: 2.11.2 version: 2.11.2 @@ -261,10 +261,10 @@ importers: version: 8.18.0 jest: specifier: ^26.0.0 - version: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + version: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-electron: specifier: ^0.1.12 - version: 0.1.12(jest@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5))) + version: 0.1.12(jest@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5))) jest-extended: specifier: ^1.2.1 version: 1.2.1 @@ -276,13 +276,13 @@ importers: version: 18.3.1(react@18.3.1) ts-jest: specifier: ^26.0.0 - version: 26.5.6(jest@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)))(typescript@4.9.5) + version: 26.5.6(jest@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)))(typescript@4.9.5) typescript: specifier: 4.9.5 version: 4.9.5 vite: specifier: 3.2.6 - version: 3.2.6(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1) + version: 3.2.6(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1) ../../packages/vrender-animate: dependencies: @@ -291,7 +291,7 @@ importers: version: link:../vrender-core '@visactor/vutils': specifier: ~1.0.12 - version: 1.0.12 + version: 1.0.23 devDependencies: '@internal/bundler': specifier: workspace:* @@ -310,13 +310,13 @@ importers: version: 2.6.4 '@types/react': specifier: ^18.0.0 - version: 18.3.20 + version: 18.3.28 '@types/react-dom': specifier: ^18.0.0 - version: 18.3.5(@types/react@18.3.20) + version: 18.3.7(@types/react@18.3.28) '@vitejs/plugin-react': specifier: 3.1.0 - version: 3.1.0(vite@3.2.6(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1)) + version: 3.1.0(vite@3.2.6(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1)) canvas: specifier: 2.11.2 version: 2.11.2 @@ -340,7 +340,7 @@ importers: version: 4.9.5 vite: specifier: 3.2.6 - version: 3.2.6(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1) + version: 3.2.6(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1) ../../packages/vrender-components: dependencies: @@ -355,10 +355,10 @@ importers: version: link:../vrender-kits '@visactor/vscale': specifier: ~1.0.12 - version: 1.0.12 + version: 1.0.23 '@visactor/vutils': specifier: ~1.0.12 - version: 1.0.12 + version: 1.0.23 devDependencies: '@internal/bundler': specifier: workspace:* @@ -383,28 +383,28 @@ importers: version: 8.18.0 jest: specifier: ^26.0.0 - version: 26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + version: 26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-electron: specifier: ^0.1.12 - version: 0.1.12(jest@26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5))) + version: 0.1.12(jest@26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5))) lil-gui: specifier: ^0.17.0 version: 0.17.0 ts-jest: specifier: ^26.0.0 - version: 26.5.6(jest@26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)))(typescript@4.9.5) + version: 26.5.6(jest@26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)))(typescript@4.9.5) typescript: specifier: 4.9.5 version: 4.9.5 vite: specifier: 3.2.6 - version: 3.2.6(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1) + version: 3.2.6(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1) ../../packages/vrender-core: dependencies: '@visactor/vutils': specifier: ~1.0.12 - version: 1.0.12 + version: 1.0.23 color-convert: specifier: 2.0.1 version: 2.0.1 @@ -426,13 +426,13 @@ importers: version: 26.0.24 '@types/react': specifier: ^18.0.0 - version: 18.3.20 + version: 18.3.28 '@types/react-dom': specifier: ^18.0.0 - version: 18.3.5(@types/react@18.3.20) + version: 18.3.7(@types/react@18.3.28) '@vitejs/plugin-react': specifier: 3.1.0 - version: 3.1.0(vite@3.2.6(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1)) + version: 3.1.0(vite@3.2.6(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -441,10 +441,10 @@ importers: version: 8.18.0 jest: specifier: ^26.0.0 - version: 26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + version: 26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-electron: specifier: ^0.1.12 - version: 0.1.12(jest@26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5))) + version: 0.1.12(jest@26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5))) jest-extended: specifier: ^1.2.1 version: 1.2.1 @@ -456,13 +456,13 @@ importers: version: 18.3.1(react@18.3.1) ts-jest: specifier: ^26.0.0 - version: 26.5.6(jest@26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)))(typescript@4.9.5) + version: 26.5.6(jest@26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)))(typescript@4.9.5) typescript: specifier: 4.9.5 version: 4.9.5 vite: specifier: 3.2.6 - version: 3.2.6(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1) + version: 3.2.6(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1) ../../packages/vrender-kits: dependencies: @@ -474,13 +474,13 @@ importers: version: link:../vrender-core '@visactor/vutils': specifier: ~1.0.12 - version: 1.0.12 + version: 1.0.23 gifuct-js: specifier: 2.1.2 version: 2.1.2 lottie-web: specifier: ^5.12.2 - version: 5.12.2 + version: 5.13.0 roughjs: specifier: 4.6.6 version: 4.6.6 @@ -502,13 +502,13 @@ importers: version: 2.6.4 '@types/react': specifier: ^18.0.0 - version: 18.3.20 + version: 18.3.28 '@types/react-dom': specifier: ^18.0.0 - version: 18.3.5(@types/react@18.3.20) + version: 18.3.7(@types/react@18.3.28) '@vitejs/plugin-react': specifier: 3.1.0 - version: 3.1.0(vite@3.2.6(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1)) + version: 3.1.0(vite@3.2.6(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1)) canvas: specifier: 2.11.2 version: 2.11.2 @@ -532,7 +532,7 @@ importers: version: 4.9.5 vite: specifier: 3.2.6 - version: 3.2.6(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1) + version: 3.2.6(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1) ../../share/eslint-config: dependencies: @@ -569,14 +569,14 @@ importers: version: 26.6.2 ts-jest: specifier: ^26.0.0 - version: 26.5.6(jest@26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)))(typescript@4.9.5) + version: 26.5.6(jest@26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)))(typescript@4.9.5) devDependencies: '@types/jest': specifier: ^26.0.0 version: 26.0.24 jest: specifier: ^26.0.0 - version: 26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + version: 26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) typescript: specifier: 4.9.5 version: 4.9.5 @@ -615,7 +615,7 @@ importers: version: 1.1.4 '@types/node': specifier: '*' - version: 22.13.17 + version: 25.5.0 '@types/node-fetch': specifier: 2.6.4 version: 2.6.4 @@ -627,13 +627,13 @@ importers: version: 8.18.0 form-data: specifier: ~4.0.0 - version: 4.0.2 + version: 4.0.5 node-fetch: specifier: 2.6.6 version: 2.6.6 ts-node: specifier: 10.9.0 - version: 10.9.0(@types/node@22.13.17)(typescript@4.9.5) + version: 10.9.0(@types/node@25.5.0)(typescript@4.9.5) typescript: specifier: 4.9.5 version: 4.9.5 @@ -826,7 +826,7 @@ importers: version: 0.7.31 '@types/node': specifier: '*' - version: 22.13.17 + version: 25.5.0 '@types/semver': specifier: 7.3.12 version: 7.3.12 @@ -850,7 +850,7 @@ importers: version: 8.18.0 ts-node: specifier: 10.9.0 - version: 10.9.0(@types/node@22.13.17)(typescript@4.9.5) + version: 10.9.0(@types/node@25.5.0)(typescript@4.9.5) typescript: specifier: 4.9.5 version: 4.9.5 @@ -873,12 +873,12 @@ packages: react: '>=16' react-dom: '>=16' - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.8': - resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + '@babel/compat-data@7.29.0': + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} engines: {node: '>=6.9.0'} '@babel/core@7.20.12': @@ -889,26 +889,26 @@ packages: resolution: {integrity: sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.27.0': - resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.25.9': - resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.0': - resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.27.0': - resolution: {integrity: sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==} + '@babel/helper-create-class-features-plugin@7.28.6': + resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.27.0': - resolution: {integrity: sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==} + '@babel/helper-create-regexp-features-plugin@7.28.5': + resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -922,77 +922,81 @@ packages: resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.25.9': - resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.25.9': - resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.26.5': - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.25.9': - resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.26.5': - resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} + '@babel/helper-replace-supers@7.28.6': + resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + '@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==} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.25.9': - resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + '@babel/helper-wrap-function@7.28.6': + resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.0': - resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} + '@babel/helpers@7.29.2': + resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.0': - resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + '@babel/parser@7.29.2': + resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': - resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': - resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 @@ -1134,8 +1138,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-export-default-from@7.25.9': - resolution: {integrity: sha512-9MhJ/SMTsVqsd69GyQg89lYR4o9T+oDGv5F6IsigxxqFVOyR/IflDLYP8WDI1l8fkhNGGktqkvL5qwNCtGEpgQ==} + '@babel/plugin-syntax-export-default-from@7.28.6': + resolution: {integrity: sha512-Svlx1fjJFnNz0LZeUaybRukSxZI3KkpApUmIRzEdXC5k8ErTOz0OD0kNrICi5Vc3GlpP5ZCeRyRO+mfWTSz+iQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1145,14 +1149,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.26.0': - resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} + '@babel/plugin-syntax-import-assertions@7.28.6': + resolution: {integrity: sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.26.0': - resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + '@babel/plugin-syntax-import-attributes@7.28.6': + resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1167,8 +1171,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.25.9': - resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + '@babel/plugin-syntax-jsx@7.28.6': + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1215,248 +1219,248 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.25.9': - resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + '@babel/plugin-syntax-typescript@7.28.6': + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-arrow-functions@7.25.9': - resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.25.9': - resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + '@babel/plugin-transform-async-to-generator@7.28.6': + resolution: {integrity: sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.26.5': - resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.27.0': - resolution: {integrity: sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==} + '@babel/plugin-transform-block-scoping@7.28.6': + resolution: {integrity: sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-classes@7.25.9': - resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + '@babel/plugin-transform-classes@7.28.6': + resolution: {integrity: sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.25.9': - resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + '@babel/plugin-transform-computed-properties@7.28.6': + resolution: {integrity: sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.25.9': - resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} + '@babel/plugin-transform-destructuring@7.28.5': + resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.25.9': - resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} + '@babel/plugin-transform-dotall-regex@7.28.6': + resolution: {integrity: sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.25.9': - resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.26.3': - resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} + '@babel/plugin-transform-exponentiation-operator@7.28.6': + resolution: {integrity: sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.26.9': - resolution: {integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==} + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.25.9': - resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.25.9': - resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.25.9': - resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.25.9': - resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.26.3': - resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} + '@babel/plugin-transform-modules-commonjs@7.28.6': + resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.25.9': - resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} + '@babel/plugin-transform-modules-systemjs@7.29.0': + resolution: {integrity: sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.25.9': - resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + '@babel/plugin-transform-named-capturing-groups-regex@7.29.0': + resolution: {integrity: sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.25.9': - resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.25.9': - resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.25.9': - resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} + '@babel/plugin-transform-optional-chaining@7.28.6': + resolution: {integrity: sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.25.9': - resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} + '@babel/plugin-transform-parameters@7.27.7': + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.25.9': - resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-display-name@7.25.9': - resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==} + '@babel/plugin-transform-react-display-name@7.28.0': + resolution: {integrity: sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-development@7.25.9': - resolution: {integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==} + '@babel/plugin-transform-react-jsx-development@7.27.1': + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.25.9': - resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.25.9': - resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx@7.25.9': - resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} + '@babel/plugin-transform-react-jsx@7.28.6': + resolution: {integrity: sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-pure-annotations@7.25.9': - resolution: {integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==} + '@babel/plugin-transform-react-pure-annotations@7.27.1': + resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.27.0': - resolution: {integrity: sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==} + '@babel/plugin-transform-regenerator@7.29.0': + resolution: {integrity: sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-reserved-words@7.25.9': - resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.25.9': - resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.25.9': - resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} + '@babel/plugin-transform-spread@7.28.6': + resolution: {integrity: sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.25.9': - resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.26.8': - resolution: {integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==} + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.27.0': - resolution: {integrity: sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==} + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.27.0': - resolution: {integrity: sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==} + '@babel/plugin-transform-typescript@7.28.6': + resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.25.9': - resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.25.9': - resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1484,20 +1488,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.27.0': - resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} engines: {node: '>=6.9.0'} - '@babel/template@7.27.0': - resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.27.0': - resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} - '@babel/types@7.27.0': - resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -1633,26 +1637,21 @@ packages: resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} engines: {node: '>= 10.14.2'} - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -1833,8 +1832,8 @@ packages: rollup: optional: true - '@rollup/pluginutils@5.1.4': - resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -1866,8 +1865,8 @@ packages: '@trufflesuite/spinnies@0.1.1': resolution: {integrity: sha512-jltEtmFJj6xmQqr85gP8OqBHCEiId+zw+uAsb3DyLLRD17O6sySW6Afa2Z/jpzSafj+32ssDfLJ+c0of1NLqcA==} - '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + '@tsconfig/node10@1.0.12': + resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} '@tsconfig/node12@1.0.11': resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} @@ -1905,14 +1904,14 @@ packages: '@types/babel__core@7.20.0': resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} - '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.7': - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} '@types/chai-subset@1.3.6': resolution: {integrity: sha512-m8lERkkQj+uek18hXOZuec3W/fCRTrU4hrnXjH3qhHy96ytuPaPiWGgu7sJb7tZxZonO75vYAjCvpe/e4VUwRw==} @@ -1928,8 +1927,8 @@ packages: '@types/debug@4.1.7': resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/expect@1.20.4': resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==} @@ -1937,8 +1936,8 @@ packages: '@types/fs-extra@9.0.13': resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} - '@types/glob-stream@8.0.2': - resolution: {integrity: sha512-kyuRfGE+yiSJWzSO3t74rXxdZNdYfLcllO0IUha4eX1fl40pm9L02Q/TEc3mykTLjoWz4STBNwYnUWdFu3I0DA==} + '@types/glob-stream@8.0.3': + resolution: {integrity: sha512-vctgrT9AH/GK3TRaIbRUU0TZn12GBU4kzelZdPyJp1Sc8L/6Wrq21UrtN4+x4saqTg6COUIUtFV6JSYcVln/EQ==} '@types/glob-watcher@5.0.2': resolution: {integrity: sha512-MZeh2nIzibl/euv5UV0femkGzcKTSE4G2+zv48d6ymeitWwCx52+4X+FqzML9oH2mQnPs+N/JHp3CsBPj1x1Ug==} @@ -1997,8 +1996,9 @@ packages: '@types/merge2@1.4.0': resolution: {integrity: sha512-MRHDvln2ldZELrUC8n1PGaQzZ33aNh8uDcsGehREW0zR1Fr818a4/JTZjO9eloHPPxnpUp8fz/YFTRc5CWm7Xw==} - '@types/minimatch@5.1.2': - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + '@types/minimatch@6.0.0': + resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==} + deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed. '@types/minimist@1.2.2': resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} @@ -2012,23 +2012,23 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@22.13.17': - resolution: {integrity: sha512-nAJuQXoyPj04uLgu+obZcSmsfOenUg6DxPKogeUy6yNCFwWaj5sBF8/G/pNo8EtBJjAfSVgfIlugR/BCOleO+g==} + '@types/node@25.5.0': + resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/picomatch@4.0.0': - resolution: {integrity: sha512-J1Bng+wlyEERWSgJQU1Pi0HObCLVcr994xT/M+1wcl/yNRTGBupsCxthgkdYG+GCOMaQH7iSVUY3LJVBBqG7MQ==} + '@types/picomatch@4.0.2': + resolution: {integrity: sha512-qHHxQ+P9PysNEGbALT8f8YOSHW0KJu6l2xU8DYY0fu/EmGxXdVnuTLvFUvBgPJMSqXq29SYHveejeAha+4AYgA==} '@types/prettier@2.7.3': resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - '@types/prop-types@15.7.14': - resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - '@types/react-dom@18.3.5': - resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} + '@types/react-dom@18.3.7': + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} peerDependencies: '@types/react': ^18.0.0 @@ -2037,8 +2037,8 @@ packages: peerDependencies: '@types/react': '*' - '@types/react@18.3.20': - resolution: {integrity: sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==} + '@types/react@18.3.28': + resolution: {integrity: sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==} '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -2068,8 +2068,8 @@ packages: '@types/undertaker@1.2.8': resolution: {integrity: sha512-gW3PRqCHYpo45XFQHJBhch7L6hytPsIe0QeLujlnFsjHPnXLhJcPdN6a9368d7aIQgH2I/dUTPFBlGeSNA3qOg==} - '@types/vinyl-fs@3.0.5': - resolution: {integrity: sha512-ckYz9giHgV6U10RFuf9WsDQ3X86EFougapxHmmoxLK7e6ICQqO8CE+4V/3lBN148V5N1pb4nQMmMjyScleVsig==} + '@types/vinyl-fs@3.0.7': + resolution: {integrity: sha512-ojGFhBnh5pj5Crf2yBOk3rjJXUX2U4W9z6tZ7hn6pUbQa/J8KH8NrXem0POYVQWI3ifnx4T65DPktuWfxc3iiA==} '@types/vinyl@2.0.7': resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==} @@ -2080,8 +2080,8 @@ packages: '@types/yargs@13.0.12': resolution: {integrity: sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==} - '@types/yargs@15.0.19': - resolution: {integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==} + '@types/yargs@15.0.20': + resolution: {integrity: sha512-KIkX+/GgfFitlASYCGoSF+T4XRXhOubJLhkLVtSfsRTe9jWMmuM2g28zQ41BtPTG7TRBb2xHW+LCNVE9QR/vsg==} '@typescript-eslint/eslint-plugin@5.30.0': resolution: {integrity: sha512-lvhRJ2pGe2V9MEU46ELTdiHgiAFZPKtLhiU5wlnaYpMc2+c1R8fh8i80ZAa665drvjHKUJyRRGg3gEm1If54ow==} @@ -2198,8 +2198,8 @@ packages: '@visactor/vscale@0.15.14': resolution: {integrity: sha512-ttGdvS49APcO23WFfsbq9zyQ1y767LjqchPPL78KOrd4UjhYQXRCdeqz7K4A57e333R37oLnPfSuIVFz9qJGYw==} - '@visactor/vscale@1.0.12': - resolution: {integrity: sha512-Mx81QatZKAWWcfX2BfX25jZRLwXVdWNt92PtA7hwVs8HplXA+ZcEvSQbZkma/ssZ66ijgSlWUQOlxJ87ZY0FBw==} + '@visactor/vscale@1.0.23': + resolution: {integrity: sha512-XePhYuRoNAp+8MeSMuEOOvhVAlOwvM1sDT2yFxE6zdwVB2GjZk8mH+5N2xQGQWk75YmGJjlJASFtgwjlb1yWxw==} '@visactor/vutils@0.13.3': resolution: {integrity: sha512-lCFiuUHwqz/0RCvIYa79ycduCLAILWaXddPOjxEd3VRX9CCoWMUmRtM3gF5JxtK2pK6Mu7hW7LaMSuWFw+0Kkw==} @@ -2207,8 +2207,8 @@ packages: '@visactor/vutils@0.15.14': resolution: {integrity: sha512-mZuJhXdDZqq5arqc/LfEmWOY6l7ErK1MurO8bR3vESxeCaQ18pN36iit15K2IMQVJuKZPnZ2ksw8+a1irXi/8A==} - '@visactor/vutils@1.0.12': - resolution: {integrity: sha512-lHvWbB2gC+IvkGkgnGbxiAeRQ99EEvgPqor6joyZ5KOU2lelHo8KPeSGzZMbN6LNwrpAsnV3x9jds7lGdC1NHQ==} + '@visactor/vutils@1.0.23': + resolution: {integrity: sha512-M8SLqgdHhKN8QmQKTWD1gzEaHptpIV9pvMYvC6+VeOsqYvZZ6UdhSCAAczTYVo+m/uwcEC2JHSUspbrs8rzlRQ==} '@vitejs/plugin-react@3.1.0': resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} @@ -2260,8 +2260,8 @@ packages: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} engines: {node: '>=0.4.0'} - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + acorn-walk@8.3.5: + resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} engines: {node: '>=0.4.0'} acorn@5.7.4: @@ -2279,8 +2279,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true @@ -2288,8 +2288,8 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.14.0: + resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} ansi-colors@1.1.0: resolution: {integrity: sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==} @@ -2354,8 +2354,8 @@ packages: resolution: {integrity: sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==} engines: {node: '>=0.10.0'} - aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + aproba@2.1.0: + resolution: {integrity: sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==} archy@1.0.0: resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} @@ -2413,8 +2413,8 @@ packages: array-equal@1.0.2: resolution: {integrity: sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==} - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} array-initial@1.1.0: @@ -2521,8 +2521,8 @@ packages: aws4@1.13.2: resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} - axios@1.8.4: - resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} + axios@1.14.0: + resolution: {integrity: sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==} b-tween@0.3.3: resolution: {integrity: sha512-oEHegcRpA7fAuc9KC4nktucuZn2aS8htymCPcP3qkEGPqiBH+GfqtqoG2l7LxHngg6O0HFM7hOeOYExl1Oz4ZA==} @@ -2576,10 +2576,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - babel-preset-current-node-syntax@1.1.0: - resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0 || ^8.0.0-0 babel-preset-jest@24.9.0: resolution: {integrity: sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==} @@ -2600,10 +2600,19 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + base@0.11.2: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} engines: {node: '>=0.10.0'} + baseline-browser-mapping@2.10.12: + resolution: {integrity: sha512-qyq26DxfY4awP2gIRXhhLWfwzwI+N5Nxk6iQi8EFizIaWIjqicQTE4sLnZZVdeKPRcVNoJOkkpfzoIYuvCKaIQ==} + engines: {node: '>=6.0.0'} + hasBin: true + bcrypt-pbkdf@1.0.2: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} @@ -2629,11 +2638,15 @@ packages: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.13: + resolution: {integrity: sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==} + + brace-expansion@2.0.3: + resolution: {integrity: sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + engines: {node: 18 || 20 || >=22} braces@2.3.2: resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} @@ -2649,8 +2662,8 @@ packages: browser-resolve@1.11.3: resolution: {integrity: sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==} - browserslist@4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2715,8 +2728,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001707: - resolution: {integrity: sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==} + caniuse-lite@1.0.30001782: + resolution: {integrity: sha512-dZcaJLJeDMh4rELYFw1tvSn1bhZWYFOt468FcbHHxx/Z/dFidd1I6ciyFdi3iwfQCyOjqo9upF6lGQYtMiJWxw==} canvas@2.11.2: resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} @@ -2819,8 +2832,8 @@ packages: resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} engines: {node: '>=0.10.0'} - collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + collect-v8-coverage@1.0.3: + resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} collection-map@1.0.0: resolution: {integrity: sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA==} @@ -2917,8 +2930,8 @@ packages: copy-props@2.0.5: resolution: {integrity: sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==} - core-js-compat@3.41.0: - resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} + core-js-compat@3.49.0: + resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} core-js@3.31.1: resolution: {integrity: sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==} @@ -2961,8 +2974,8 @@ packages: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} d3-array@1.2.4: resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==} @@ -3013,8 +3026,8 @@ packages: resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} engines: {node: '>=6'} - dayjs@1.11.13: - resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + dayjs@1.11.20: + resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} debug-fabulous@1.1.0: resolution: {integrity: sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==} @@ -3038,8 +3051,8 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - decimal.js@10.5.0: - resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} @@ -3110,8 +3123,8 @@ packages: resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} engines: {node: '>=0.10.0'} - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} detect-newline@2.1.0: @@ -3140,8 +3153,8 @@ packages: resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + diff@4.0.4: + resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} engines: {node: '>=0.3.1'} dir-glob@3.0.1: @@ -3204,8 +3217,8 @@ packages: ecc-jsbn@0.1.2: resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - electron-to-chromium@1.5.129: - resolution: {integrity: sha512-JlXUemX4s0+9f8mLqib/bHH8gOHf5elKS6KeWG3sk3xozb/JTq/RLXIv8OKUWiK4Ah00Wm88EFj5PYkFr4RUPA==} + electron-to-chromium@1.5.329: + resolution: {integrity: sha512-/4t+AS1l4S3ZC0Ja7PHFIWeBIxGA3QGqV8/yKsP36v7NcyUCl+bIcmw6s5zVuMIECWwBrAK/6QLzTmbJChBboQ==} electron@11.5.0: resolution: {integrity: sha512-WjNDd6lGpxyiNjE3LhnFCAk/D9GIj1rU3GSDealVShhkkkPR3Vh4q8ErXGDl1OAO/faomVa10KoFPUN/pLbNxg==} @@ -3226,8 +3239,8 @@ packages: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -3244,11 +3257,11 @@ packages: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - es-abstract@1.23.9: - resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + es-abstract@1.24.1: + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} engines: {node: '>= 0.4'} es-array-method-boxes-properly@1.0.0: @@ -3511,8 +3524,8 @@ packages: engines: {node: '>=4'} hasBin: true - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -3624,8 +3637,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} @@ -3683,8 +3696,8 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} flush-write-stream@1.1.1: resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} @@ -3693,8 +3706,8 @@ packages: resolution: {integrity: sha512-Ik/6OCk9RQQ0T5Xw+hKNLWrjSMtv51dD4GRmJjbD5a58TIEpI5a5iXagKVl3Z5UuyslMCA8Xwnu76jQob62Yhg==} engines: {node: '>=10'} - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -3724,12 +3737,12 @@ packages: resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} engines: {node: '>= 0.12'} - form-data@3.0.3: - resolution: {integrity: sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==} + form-data@3.0.4: + resolution: {integrity: sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==} engines: {node: '>= 6'} - form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} fraction.js@4.3.7: @@ -3787,6 +3800,10 @@ packages: engines: {node: '>=10'} deprecated: This package is no longer supported. + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -3874,12 +3891,12 @@ packages: glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me global-agent@3.0.0: resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} @@ -3897,10 +3914,6 @@ packages: resolution: {integrity: sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==} engines: {node: '>=0.10'} - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} @@ -4055,8 +4068,8 @@ packages: htmlparser2@4.1.0: resolution: {integrity: sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==} - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} http-proxy-agent@4.0.1: resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} @@ -4150,8 +4163,8 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-arrayish@0.3.4: + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} @@ -4249,8 +4262,8 @@ packages: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} is-glob@3.1.0: @@ -4272,6 +4285,10 @@ packages: resolution: {integrity: sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==} engines: {node: '>=0.10.0'} + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -4429,8 +4446,8 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} istextorbinary@3.3.0: @@ -4682,12 +4699,12 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true jsbn@0.1.1: @@ -4710,11 +4727,6 @@ packages: engines: {node: '>=4'} hasBin: true - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -4752,8 +4764,8 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} jsprim@1.4.2: resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} @@ -4882,8 +4894,8 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - lottie-web@5.12.2: - resolution: {integrity: sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg==} + lottie-web@5.13.0: + resolution: {integrity: sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ==} loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} @@ -4910,8 +4922,8 @@ packages: resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} engines: {node: '>=12'} - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} @@ -5020,11 +5032,15 @@ packages: resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} engines: {node: '>=8'} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} engines: {node: '>=10'} minimist@1.2.0: @@ -5061,8 +5077,8 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.7.4: - resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -5077,8 +5093,8 @@ packages: resolution: {integrity: sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==} engines: {node: '>= 0.10'} - nan@2.22.2: - resolution: {integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==} + nan@2.26.2: + resolution: {integrity: sha512-0tTvBTYkt3tdGw22nrAy50x7gpbGCCFH3AFcyS5WiUu7Eu4vWlri1woE6qHBSfy11vksDqkiwjOnlR7WV8G1Hw==} nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} @@ -5092,8 +5108,8 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - needle@3.3.1: - resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + needle@3.5.0: + resolution: {integrity: sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w==} engines: {node: '>= 4.4.x'} hasBin: true @@ -5103,6 +5119,10 @@ packages: nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + node-exports-info@1.6.0: + resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} + engines: {node: '>= 0.4'} + node-fetch@2.6.6: resolution: {integrity: sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==} engines: {node: 4.x || >=6.0.0} @@ -5122,8 +5142,8 @@ packages: node-notifier@8.0.2: resolution: {integrity: sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==} - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.36: + resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} @@ -5176,8 +5196,8 @@ packages: number-precision@1.6.0: resolution: {integrity: sha512-05OLPgbgmnixJw+VvEh18yNPUo3iyp4BEWJcrLu4X9W05KmMifN7Mu5exYvQXqxxeNWhvIF+j3Rij+HmddM/hQ==} - nwsapi@2.2.20: - resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} + nwsapi@2.2.23: + resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} oauth-sign@0.9.0: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} @@ -5218,9 +5238,9 @@ packages: resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} - object.getownpropertydescriptors@2.1.8: - resolution: {integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==} - engines: {node: '>= 0.8'} + object.getownpropertydescriptors@2.1.9: + resolution: {integrity: sha512-mt8YM6XwsTTovI+kdZdHSxoyF2DI59up034orlC9NfweclcWOt7CVascNNLp6U+bjFVCVCIh9PwS76tDM/rH8g==} + engines: {node: '>= 0.4'} object.hasown@1.1.4: resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} @@ -5429,12 +5449,12 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} pify@2.3.0: @@ -5555,8 +5575,9 @@ packages: protocol-buffers-schema@3.6.0: resolution: {integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==} - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} @@ -5567,8 +5588,8 @@ packages: pump@2.0.1: resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} pumpify@1.5.1: resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} @@ -5577,8 +5598,8 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.5.3: - resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + qs@6.5.5: + resolution: {integrity: sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==} engines: {node: '>=0.6'} querystringify@2.2.0: @@ -5590,8 +5611,8 @@ packages: randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - react-clientside-effect@1.2.7: - resolution: {integrity: sha512-gce9m0Pk/xYYMEojRI9bgvqQAkl6hm7ozQvqWPyQx+kULiatdHgkNM1QG4DQRx5N9BAzWSCJmt9mMV8/KsdgVg==} + react-clientside-effect@1.2.8: + resolution: {integrity: sha512-ma2FePH0z3px2+WOu6h+YycZcEvFmmxIlAb62cF52bG86eMySciO/EQZeQMXd07kPCYB0a1dWDT5J+KE9mCDUw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -5600,8 +5621,8 @@ packages: peerDependencies: react: ^18.3.1 - react-focus-lock@2.13.6: - resolution: {integrity: sha512-ehylFFWyYtBKXjAO9+3v8d0i+cnc1trGS0vlTGhzFW1vbFXVUTmR8s2tt/ZQG8x5hElg6rhENlLG1H3EZK0Llg==} + react-focus-lock@2.13.7: + resolution: {integrity: sha512-20lpZHEQrXPb+pp1tzd4ULL6DyO5D2KnR0G69tTDdydrmNhU7pdFmbQUYVyHUgp+xN29IuFR0PVuhOmvaZL9Og==} peerDependencies: '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -5702,19 +5723,13 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - regenerate-unicode-properties@10.2.0: - resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} engines: {node: '>=4'} regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - regex-not@1.0.2: resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} engines: {node: '>=0.10.0'} @@ -5727,15 +5742,15 @@ packages: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} - regexpu-core@6.2.0: - resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} engines: {node: '>=4'} regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - regjsparser@0.12.0: - resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + regjsparser@0.13.0: + resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} hasBin: true remove-bom-buffer@3.0.0: @@ -5832,13 +5847,14 @@ packages: resolve@1.1.7: resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} engines: {node: '>= 0.4'} hasBin: true - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + resolve@2.0.0-next.6: + resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==} + engines: {node: '>= 0.4'} hasBin: true responselike@1.0.2: @@ -5880,8 +5896,8 @@ packages: rollup: optional: true - rollup@2.79.2: - resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} + rollup@2.80.0: + resolution: {integrity: sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ==} engines: {node: '>=10.0.0'} hasBin: true @@ -5933,8 +5949,9 @@ packages: deprecated: some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added hasBin: true - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} saxes@5.0.1: resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} @@ -5966,8 +5983,8 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} hasBin: true @@ -6051,11 +6068,11 @@ packages: simple-get@3.1.1: resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} - simple-statistics@7.8.8: - resolution: {integrity: sha512-CUtP0+uZbcbsFpqEyvNDYjJCl+612fNgjT8GaVuvMG7tBuJg8gXGpsP5M7X658zy0IcepWOZ6nPBu1Qb9ezA1w==} + simple-statistics@7.8.9: + resolution: {integrity: sha512-YT6MLqYsz7y1rQZOLFlOCCgSRpCi6bqY417yhoOLI7aVoBi29dD39EPrOE03W9DY25H0J0jizVsHZnkLzyGJFg==} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + simple-swizzle@0.2.4: + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} simplify-geojson@1.0.5: resolution: {integrity: sha512-02l1W4UipP5ivNVq6kX15mAzCRIV1oI3tz0FUEyOsNiv1ltuFDjbNhO+nbv/xhbDEtKqWLYuzpWhUsJrjR/ypA==} @@ -6124,9 +6141,9 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} sparkles@1.0.1: resolution: {integrity: sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==} @@ -6141,8 +6158,8 @@ packages: spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - spdx-license-ids@3.0.21: - resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} + spdx-license-ids@3.0.23: + resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} split-string@3.1.0: resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} @@ -6177,13 +6194,17 @@ packages: resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} engines: {node: '>=0.10.0'} - std-env@3.8.1: - resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} stealthy-require@1.1.1: resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} engines: {node: '>=0.10.0'} + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + stream-exhaust@1.0.2: resolution: {integrity: sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==} @@ -6310,6 +6331,7 @@ packages: tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me terminal-link@2.1.1: resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} @@ -6556,8 +6578,8 @@ packages: uc.micro@1.0.6: resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} - ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} @@ -6575,8 +6597,8 @@ packages: resolution: {integrity: sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==} engines: {node: '>= 0.10'} - undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} @@ -6586,20 +6608,20 @@ packages: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} - unicode-match-property-value-ecmascript@2.2.0: - resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} engines: {node: '>=4'} - unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + unicode-property-aliases-ecmascript@2.2.0: + resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} engines: {node: '>=4'} union-value@1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} engines: {node: '>=0.10.0'} - unique-stream@2.3.1: - resolution: {integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==} + unique-stream@2.4.0: + resolution: {integrity: sha512-V6QarSfeSgDipGA9EZdoIzu03ZDlOFkk+FbEP5cwgrZXN3iIkYR91IjU2EnM6rB835kGQsqHX8qncObTXV+6KA==} universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} @@ -6621,8 +6643,8 @@ packages: resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} engines: {node: '>=4'} - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -6810,6 +6832,7 @@ packages: whatwg-encoding@1.0.5: resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-mimetype@2.3.0: resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} @@ -6845,8 +6868,8 @@ packages: which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} engines: {node: '>= 0.4'} which@1.3.1: @@ -6975,34 +6998,34 @@ packages: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} - yocto-queue@1.2.1: - resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 '@arco-design/color@0.4.0': dependencies: color: 3.2.1 - '@arco-design/web-react@2.46.1(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@arco-design/web-react@2.46.1(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@arco-design/color': 0.4.0 - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.29.2 b-tween: 0.3.3 b-validate: 1.5.3 compute-scroll-into-view: 1.0.20 - dayjs: 1.11.13 + dayjs: 1.11.20 lodash: 4.17.21 number-precision: 1.6.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-focus-lock: 2.13.6(@types/react@18.3.20)(react@18.3.1) + react-focus-lock: 2.13.7(@types/react@18.3.28)(react@18.3.1) react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) resize-observer-polyfill: 1.5.1 scroll-into-view-if-needed: 2.2.20 @@ -7010,26 +7033,26 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@babel/code-frame@7.26.2': + '@babel/code-frame@7.29.0': dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.26.8': {} + '@babel/compat-data@7.29.0': {} '@babel/core@7.20.12': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.29.0 '@babel/generator': 7.21.1 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.20.12) - '@babel/helpers': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.20.12) + '@babel/helpers': 7.29.2 + '@babel/parser': 7.29.2 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -7040,155 +7063,157 @@ snapshots: '@babel/generator@7.21.1': dependencies: - '@babel/types': 7.27.0 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 2.5.2 - '@babel/generator@7.27.0': + '@babel/generator@7.29.1': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.25.9': + '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.29.0 - '@babel/helper-compilation-targets@7.27.0': + '@babel/helper-compilation-targets@7.28.6': dependencies: - '@babel/compat-data': 7.26.8 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.4 + '@babel/compat-data': 7.29.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.0(@babel/core@7.20.12)': + '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.20.12) - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.20.12) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.29.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.27.0(@babel/core@7.20.12)': + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-annotate-as-pure': 7.25.9 - regexpu-core: 6.2.0 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.4.0 semver: 6.3.1 '@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 debug: 4.3.4 lodash.debounce: 4.0.8 - resolve: 1.22.10 + resolve: 1.22.11 semver: 6.3.1 transitivePeerDependencies: - supports-color '@babel/helper-environment-visitor@7.24.7': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.29.0 - '@babel/helper-member-expression-to-functions@7.25.9': + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.28.5': dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.25.9': + '@babel/helper-module-imports@7.28.6': dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.20.12)': + '@babel/helper-module-transforms@7.28.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.25.9': + '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.29.0 - '@babel/helper-plugin-utils@7.26.5': {} + '@babel/helper-plugin-utils@7.28.6': {} - '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.20.12)': + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.26.5(@babel/core@7.20.12)': + '@babel/helper-replace-supers@7.28.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 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.28.5': {} - '@babel/helper-validator-option@7.25.9': {} + '@babel/helper-validator-option@7.27.1': {} - '@babel/helper-wrap-function@7.25.9': + '@babel/helper-wrap-function@7.28.6': dependencies: - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helpers@7.27.0': + '@babel/helpers@7.29.2': dependencies: - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 - '@babel/parser@7.27.0': + '@babel/parser@7.29.2': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.29.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.20.12) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.20.12) transitivePeerDependencies: - supports-color @@ -7196,8 +7221,8 @@ snapshots: dependencies: '@babel/core': 7.20.12 '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.20.12) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.20.12) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.20.12) transitivePeerDependencies: - supports-color @@ -7205,16 +7230,16 @@ snapshots: '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.20.12) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.20.12) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color '@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.20.12) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.20.12) + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.20.12) transitivePeerDependencies: - supports-color @@ -7222,65 +7247,65 @@ snapshots: '@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.20.12) '@babel/plugin-proposal-export-default-from@7.18.10(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-export-default-from': 7.25.9(@babel/core@7.20.12) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-export-default-from': 7.28.6(@babel/core@7.20.12) '@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.20.12) '@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.20.12) '@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.20.12) '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.20.12) '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.20.12) '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.20.12)': dependencies: - '@babel/compat-data': 7.26.8 + '@babel/compat-data': 7.29.0 '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.20.12) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.20.12) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.20.12) '@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.20.12) '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.20.12) transitivePeerDependencies: - supports-color @@ -7288,17 +7313,17 @@ snapshots: '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.20.12) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.20.12) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color '@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.20.12) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.20.12) + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.20.12) transitivePeerDependencies: - supports-color @@ -7306,384 +7331,386 @@ snapshots: '@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.20.12) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.20.12) + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-export-default-from@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-syntax-export-default-from@7.28.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.20.12)': + '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.20.12)': + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.20.12) + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.20.12) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.20.12)': + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-block-scoping@7.27.0(@babel/core@7.20.12)': + '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-classes@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-classes@7.28.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.20.12) - '@babel/traverse': 7.27.0 - globals: 11.12.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.20.12) + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/template': 7.27.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/template': 7.28.6 - '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.20.12) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.20.12) + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.20.12)': + '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-for-of@7.26.9(@babel/core@7.20.12)': + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.27.0 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-literals@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.20.12) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.20.12) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.20.12)': + '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.20.12) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.20.12) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-modules-systemjs@7.29.0(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.20.12) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.20.12) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.20.12) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.20.12) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.20.12) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.20.12) + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.20.12) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.20.12) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.20.12) + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.20.12) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.20.12) - '@babel/types': 7.27.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.20.12) + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-pure-annotations@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-regenerator@7.27.0(@babel/core@7.20.12)': + '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - regenerator-transform: 0.15.2 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-spread@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-spread@7.28.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-template-literals@7.26.8(@babel/core@7.20.12)': + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-typeof-symbol@7.27.0(@babel/core@7.20.12)': + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-typescript@7.27.0(@babel/core@7.20.12)': + '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.20.12) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.20.12) + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.20.12) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.20.12) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.20.12)': + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.20.12) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.20.12) + '@babel/helper-plugin-utils': 7.28.6 '@babel/preset-env@7.20.2(@babel/core@7.20.12)': dependencies: - '@babel/compat-data': 7.26.8 + '@babel/compat-data': 7.29.0 '@babel/core': 7.20.12 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.20.12) + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.20.12) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.20.12) '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.20.12) '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.20.12) '@babel/plugin-proposal-class-static-block': 7.21.0(@babel/core@7.20.12) @@ -7704,7 +7731,7 @@ snapshots: '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.20.12) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.20.12) '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.20.12) - '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.20.12) + '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.20.12) '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.20.12) '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.20.12) '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.20.12) @@ -7714,44 +7741,44 @@ snapshots: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.20.12) '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.20.12) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.20.12) - '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.20.12) - '@babel/plugin-transform-block-scoping': 7.27.0(@babel/core@7.20.12) - '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.20.12) - '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.20.12) - '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.20.12) - '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-regenerator': 7.27.0(@babel/core@7.20.12) - '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-template-literals': 7.26.8(@babel/core@7.20.12) - '@babel/plugin-transform-typeof-symbol': 7.27.0(@babel/core@7.20.12) - '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.20.12) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.20.12) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.20.12) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.20.12) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.20.12) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.20.12) + '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.20.12) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.20.12) + '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.20.12) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.20.12) + '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.20.12) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.20.12) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.20.12) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.20.12) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.20.12) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.20.12) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.20.12) + '@babel/plugin-transform-modules-systemjs': 7.29.0(@babel/core@7.20.12) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.20.12) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.20.12) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.20.12) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.20.12) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.20.12) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.20.12) + '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.20.12) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.20.12) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.20.12) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.20.12) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.20.12) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.20.12) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.20.12) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.20.12) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.20.12) '@babel/preset-modules': 0.1.6(@babel/core@7.20.12) - '@babel/types': 7.27.0 + '@babel/types': 7.29.0 babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.20.12) babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.20.12) babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.20.12) - core-js-compat: 3.41.0 + core-js-compat: 3.49.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -7759,59 +7786,57 @@ snapshots: '@babel/preset-modules@0.1.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.20.12) - '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.20.12) - '@babel/types': 7.27.0 + '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.20.12) + '@babel/types': 7.29.0 esutils: 2.0.3 '@babel/preset-react@7.18.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-react-jsx-development': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-react-pure-annotations': 7.25.9(@babel/core@7.20.12) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.20.12) + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.20.12) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.20.12) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.20.12) transitivePeerDependencies: - supports-color '@babel/preset-typescript@7.18.6(@babel/core@7.20.12)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-transform-typescript': 7.27.0(@babel/core@7.20.12) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.20.12) transitivePeerDependencies: - supports-color - '@babel/runtime@7.27.0': - dependencies: - regenerator-runtime: 0.14.1 + '@babel/runtime@7.29.2': {} - '@babel/template@7.27.0': + '@babel/template@7.28.6': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 - '@babel/traverse@7.27.0': + '@babel/traverse@7.29.0': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.2 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 debug: 4.3.4 - globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.27.0': + '@babel/types@7.29.0': dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@bcoe/v8-coverage@0.2.3': {} @@ -7847,14 +7872,14 @@ snapshots: '@eslint/eslintrc@1.4.1': dependencies: - ajv: 6.12.6 + ajv: 6.14.0 debug: 4.3.4 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 + js-yaml: 4.1.1 + minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color @@ -7876,7 +7901,7 @@ snapshots: dependencies: '@humanwhocodes/object-schema': 1.2.1 debug: 4.3.4 - minimatch: 3.1.2 + minimatch: 3.1.5 transitivePeerDependencies: - supports-color @@ -7887,7 +7912,7 @@ snapshots: camelcase: 5.3.1 find-up: 4.1.0 get-package-type: 0.1.0 - js-yaml: 3.14.1 + js-yaml: 3.14.2 resolve-from: 5.0.0 '@istanbuljs/schema@0.1.3': {} @@ -7901,33 +7926,33 @@ snapshots: '@jest/console@26.6.2': dependencies: '@jest/types': 26.6.2 - '@types/node': 22.13.17 + '@types/node': 25.5.0 chalk: 4.1.2 jest-message-util: 26.6.2 jest-util: 26.6.2 slash: 3.0.0 - '@jest/core@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5))': + '@jest/core@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5))': dependencies: '@jest/console': 26.6.2 '@jest/reporters': 26.6.2 '@jest/test-result': 26.6.2 '@jest/transform': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.13.17 + '@types/node': 25.5.0 ansi-escapes: 4.3.2 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 26.6.2 - jest-config: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest-config: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-haste-map: 26.6.2 jest-message-util: 26.6.2 jest-regex-util: 26.0.0 jest-resolve: 26.6.2 jest-resolve-dependencies: 26.6.3 - jest-runner: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) - jest-runtime: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest-runner: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) + jest-runtime: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-snapshot: 26.6.2 jest-util: 26.6.2 jest-validate: 26.6.2 @@ -7944,27 +7969,27 @@ snapshots: - ts-node - utf-8-validate - '@jest/core@26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5))': + '@jest/core@26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5))': dependencies: '@jest/console': 26.6.2 '@jest/reporters': 26.6.2 '@jest/test-result': 26.6.2 '@jest/transform': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.13.17 + '@types/node': 25.5.0 ansi-escapes: 4.3.2 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 26.6.2 - jest-config: 26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest-config: 26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-haste-map: 26.6.2 jest-message-util: 26.6.2 jest-regex-util: 26.0.0 jest-resolve: 26.6.2 jest-resolve-dependencies: 26.6.3 - jest-runner: 26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) - jest-runtime: 26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest-runner: 26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) + jest-runtime: 26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-snapshot: 26.6.2 jest-util: 26.6.2 jest-validate: 26.6.2 @@ -7994,7 +8019,7 @@ snapshots: dependencies: '@jest/fake-timers': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.13.17 + '@types/node': 25.5.0 jest-mock: 26.6.2 '@jest/fake-timers@24.9.0': @@ -8007,7 +8032,7 @@ snapshots: dependencies: '@jest/types': 26.6.2 '@sinonjs/fake-timers': 6.0.1 - '@types/node': 22.13.17 + '@types/node': 25.5.0 jest-message-util: 26.6.2 jest-mock: 26.6.2 jest-util: 26.6.2 @@ -8026,7 +8051,7 @@ snapshots: '@jest/transform': 26.6.2 '@jest/types': 26.6.2 chalk: 4.1.2 - collect-v8-coverage: 1.0.2 + collect-v8-coverage: 1.0.3 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 @@ -8034,7 +8059,7 @@ snapshots: istanbul-lib-instrument: 4.0.3 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 + istanbul-reports: 3.2.0 jest-haste-map: 26.6.2 jest-resolve: 26.6.2 jest-util: 26.6.2 @@ -8072,7 +8097,7 @@ snapshots: '@jest/console': 26.6.2 '@jest/types': 26.6.2 '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 + collect-v8-coverage: 1.0.3 '@jest/test-sequencer@24.9.0': dependencies: @@ -8083,13 +8108,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/test-sequencer@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5))': + '@jest/test-sequencer@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5))': dependencies: '@jest/test-result': 26.6.2 graceful-fs: 4.2.11 jest-haste-map: 26.6.2 - jest-runner: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) - jest-runtime: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest-runner: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) + jest-runtime: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) transitivePeerDependencies: - bufferutil - canvas @@ -8097,13 +8122,13 @@ snapshots: - ts-node - utf-8-validate - '@jest/test-sequencer@26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5))': + '@jest/test-sequencer@26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5))': dependencies: '@jest/test-result': 26.6.2 graceful-fs: 4.2.11 jest-haste-map: 26.6.2 - jest-runner: 26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) - jest-runtime: 26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest-runner: 26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) + jest-runtime: 26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) transitivePeerDependencies: - bufferutil - canvas @@ -8162,47 +8187,44 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.13.17 - '@types/yargs': 15.0.19 + '@types/node': 25.5.0 + '@types/yargs': 15.0.20 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.8': + '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/source-map@0.3.6': + '@jridgewell/source-map@0.3.11': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@mapbox/node-pre-gyp@1.0.11': dependencies: - detect-libc: 2.0.3 + detect-libc: 2.1.2 https-proxy-agent: 5.0.1 make-dir: 3.1.0 node-fetch: 2.7.0 nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 - semver: 7.7.1 + semver: 7.7.4 tar: 6.2.1 transitivePeerDependencies: - encoding @@ -8218,7 +8240,7 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 + fastq: 1.20.1 '@remix-run/router@1.4.0': {} @@ -8282,8 +8304,8 @@ snapshots: '@rollup/plugin-babel@6.0.3(@babel/core@7.20.12)(@types/babel__core@7.20.0)(rollup@3.20.5)': dependencies: '@babel/core': 7.20.12 - '@babel/helper-module-imports': 7.25.9 - '@rollup/pluginutils': 5.1.4(rollup@3.20.5) + '@babel/helper-module-imports': 7.28.6 + '@rollup/pluginutils': 5.3.0(rollup@3.20.5) optionalDependencies: '@types/babel__core': 7.20.0 rollup: 3.20.5 @@ -8292,7 +8314,7 @@ snapshots: '@rollup/plugin-commonjs@24.1.0(rollup@3.20.5)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@3.20.5) + '@rollup/pluginutils': 5.3.0(rollup@3.20.5) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 @@ -8303,18 +8325,18 @@ snapshots: '@rollup/plugin-node-resolve@15.0.2(rollup@3.20.5)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@3.20.5) + '@rollup/pluginutils': 5.3.0(rollup@3.20.5) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-builtin-module: 3.2.1 is-module: 1.0.0 - resolve: 1.22.10 + resolve: 1.22.11 optionalDependencies: rollup: 3.20.5 '@rollup/plugin-replace@5.0.2(rollup@3.20.5)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@3.20.5) + '@rollup/pluginutils': 5.3.0(rollup@3.20.5) magic-string: 0.27.0 optionalDependencies: rollup: 3.20.5 @@ -8329,8 +8351,8 @@ snapshots: '@rollup/plugin-typescript@11.1.0(rollup@3.20.5)(tslib@2.8.1)(typescript@4.9.5)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@3.20.5) - resolve: 1.22.10 + '@rollup/pluginutils': 5.3.0(rollup@3.20.5) + resolve: 1.22.11 typescript: 4.9.5 optionalDependencies: rollup: 3.20.5 @@ -8338,17 +8360,17 @@ snapshots: '@rollup/plugin-url@8.0.1(rollup@3.20.5)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@3.20.5) + '@rollup/pluginutils': 5.3.0(rollup@3.20.5) make-dir: 3.1.0 mime: 3.0.0 optionalDependencies: rollup: 3.20.5 - '@rollup/pluginutils@5.1.4(rollup@3.20.5)': + '@rollup/pluginutils@5.3.0(rollup@3.20.5)': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.2 + picomatch: 4.0.4 optionalDependencies: rollup: 3.20.5 @@ -8376,7 +8398,7 @@ snapshots: cli-cursor: 3.1.0 strip-ansi: 6.0.1 - '@tsconfig/node10@1.0.11': {} + '@tsconfig/node10@1.0.12': {} '@tsconfig/node12@1.0.11': {} @@ -8420,24 +8442,24 @@ snapshots: '@types/babel__core@7.20.0': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 - '@types/babel__generator': 7.6.8 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.7 + '@types/babel__traverse': 7.28.0 - '@types/babel__generator@7.6.8': + '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.29.0 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 - '@types/babel__traverse@7.20.7': + '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.29.0 '@types/chai-subset@1.3.6(@types/chai@4.3.20)': dependencies: @@ -8447,54 +8469,54 @@ snapshots: '@types/clean-css@4.2.6': dependencies: - '@types/node': 22.13.17 + '@types/node': 25.5.0 source-map: 0.6.1 '@types/debug@4.1.7': dependencies: '@types/ms': 0.7.31 - '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} '@types/expect@1.20.4': {} '@types/fs-extra@9.0.13': dependencies: - '@types/node': 22.13.17 + '@types/node': 25.5.0 - '@types/glob-stream@8.0.2': + '@types/glob-stream@8.0.3': dependencies: - '@types/node': 22.13.17 - '@types/picomatch': 4.0.0 + '@types/node': 25.5.0 + '@types/picomatch': 4.0.2 '@types/streamx': 2.9.5 '@types/glob-watcher@5.0.2': dependencies: - '@types/node': 22.13.17 + '@types/node': 25.5.0 '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 22.13.17 + '@types/node': 25.5.0 '@types/gulp-if@0.0.34': dependencies: - '@types/node': 22.13.17 + '@types/node': 25.5.0 '@types/vinyl': 2.0.7 '@types/gulp-match@1.1.2': dependencies: - '@types/minimatch': 5.1.2 + '@types/minimatch': 6.0.0 '@types/vinyl': 2.0.7 '@types/gulp-sourcemaps@0.0.35': dependencies: - '@types/node': 22.13.17 + '@types/node': 25.5.0 '@types/vinyl': 2.0.7 '@types/gulp@4.0.10': dependencies: '@types/undertaker': 1.2.8 - '@types/vinyl-fs': 3.0.5 + '@types/vinyl-fs': 3.0.7 chokidar: 3.6.0 '@types/highlightjs@9.12.6': {} @@ -8536,9 +8558,11 @@ snapshots: '@types/merge2@1.4.0': dependencies: - '@types/node': 22.13.17 + '@types/node': 25.5.0 - '@types/minimatch@5.1.2': {} + '@types/minimatch@6.0.0': + dependencies: + minimatch: 10.2.5 '@types/minimist@1.2.2': {} @@ -8546,35 +8570,35 @@ snapshots: '@types/node-fetch@2.6.4': dependencies: - '@types/node': 22.13.17 - form-data: 3.0.3 + '@types/node': 25.5.0 + form-data: 3.0.4 '@types/node@12.20.55': {} - '@types/node@22.13.17': + '@types/node@25.5.0': dependencies: - undici-types: 6.20.0 + undici-types: 7.18.2 '@types/normalize-package-data@2.4.4': {} - '@types/picomatch@4.0.0': {} + '@types/picomatch@4.0.2': {} '@types/prettier@2.7.3': {} - '@types/prop-types@15.7.14': {} + '@types/prop-types@15.7.15': {} - '@types/react-dom@18.3.5(@types/react@18.3.20)': + '@types/react-dom@18.3.7(@types/react@18.3.28)': dependencies: - '@types/react': 18.3.20 + '@types/react': 18.3.28 - '@types/react-reconciler@0.28.9(@types/react@18.3.20)': + '@types/react-reconciler@0.28.9(@types/react@18.3.28)': dependencies: - '@types/react': 18.3.20 + '@types/react': 18.3.28 - '@types/react@18.3.20': + '@types/react@18.3.28': dependencies: - '@types/prop-types': 15.7.14 - csstype: 3.1.3 + '@types/prop-types': 15.7.15 + csstype: 3.2.3 '@types/resolve@1.20.2': {} @@ -8586,7 +8610,7 @@ snapshots: '@types/streamx@2.9.5': dependencies: - '@types/node': 22.13.17 + '@types/node': 25.5.0 '@types/terser@3.12.0': dependencies: @@ -8594,26 +8618,26 @@ snapshots: '@types/through2@2.0.38': dependencies: - '@types/node': 22.13.17 + '@types/node': 25.5.0 '@types/undertaker-registry@1.0.4': {} '@types/undertaker@1.2.8': dependencies: - '@types/node': 22.13.17 + '@types/node': 25.5.0 '@types/undertaker-registry': 1.0.4 async-done: 1.3.2 - '@types/vinyl-fs@3.0.5': + '@types/vinyl-fs@3.0.7': dependencies: - '@types/glob-stream': 8.0.2 - '@types/node': 22.13.17 + '@types/glob-stream': 8.0.3 + '@types/node': 25.5.0 '@types/vinyl': 2.0.7 '@types/vinyl@2.0.7': dependencies: '@types/expect': 1.20.4 - '@types/node': 22.13.17 + '@types/node': 25.5.0 '@types/yargs-parser@21.0.0': {} @@ -8621,7 +8645,7 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.0 - '@types/yargs@15.0.19': + '@types/yargs@15.0.20': dependencies: '@types/yargs-parser': 21.0.0 @@ -8636,7 +8660,7 @@ snapshots: functional-red-black-tree: 1.0.1 ignore: 5.3.2 regexpp: 3.2.0 - semver: 7.7.1 + semver: 7.7.4 tsutils: 3.21.0(typescript@4.9.5) optionalDependencies: typescript: 4.9.5 @@ -8680,7 +8704,7 @@ snapshots: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.7.1 + semver: 7.7.4 tsutils: 3.21.0(typescript@4.9.5) optionalDependencies: typescript: 4.9.5 @@ -8736,7 +8760,7 @@ snapshots: path-browserify: 1.0.1 pbf: 3.3.0 point-at-length: 1.1.0 - simple-statistics: 7.8.8 + simple-statistics: 7.8.9 simplify-geojson: 1.0.5 topojson-client: 3.1.0 @@ -8848,9 +8872,9 @@ snapshots: dependencies: '@visactor/vutils': 0.15.14 - '@visactor/vscale@1.0.12': + '@visactor/vscale@1.0.23': dependencies: - '@visactor/vutils': 1.0.12 + '@visactor/vutils': 1.0.23 '@visactor/vutils@0.13.3': dependencies: @@ -8864,20 +8888,20 @@ snapshots: '@turf/invariant': 6.5.0 eventemitter3: 4.0.7 - '@visactor/vutils@1.0.12': + '@visactor/vutils@1.0.23': dependencies: '@turf/helpers': 6.5.0 '@turf/invariant': 6.5.0 eventemitter3: 4.0.7 - '@vitejs/plugin-react@3.1.0(vite@3.2.6(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1))': + '@vitejs/plugin-react@3.1.0(vite@3.2.6(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1))': dependencies: '@babel/core': 7.20.12 - '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.20.12) - '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.20.12) + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.20.12) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.20.12) magic-string: 0.27.0 react-refresh: 0.14.2 - vite: 3.2.6(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1) + vite: 3.2.6(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1) transitivePeerDependencies: - supports-color @@ -8896,7 +8920,7 @@ snapshots: '@vitest/snapshot@0.30.1': dependencies: - magic-string: 0.30.17 + magic-string: 0.30.21 pathe: 1.1.2 pretty-format: 27.5.1 @@ -8926,17 +8950,17 @@ snapshots: acorn: 7.4.1 acorn-walk: 7.2.0 - acorn-jsx@5.3.2(acorn@8.14.1): + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: - acorn: 8.14.1 + acorn: 8.16.0 acorn-walk@6.2.0: {} acorn-walk@7.2.0: {} - acorn-walk@8.3.4: + acorn-walk@8.3.5: dependencies: - acorn: 8.14.1 + acorn: 8.16.0 acorn@5.7.4: {} @@ -8944,7 +8968,7 @@ snapshots: acorn@7.4.1: {} - acorn@8.14.1: {} + acorn@8.16.0: {} agent-base@6.0.2: dependencies: @@ -8952,7 +8976,7 @@ snapshots: transitivePeerDependencies: - supports-color - ajv@6.12.6: + ajv@6.14.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -9007,13 +9031,13 @@ snapshots: anymatch@3.1.3: dependencies: normalize-path: 3.0.0 - picomatch: 2.3.1 + picomatch: 2.3.2 append-buffer@1.0.2: dependencies: buffer-equal: 1.0.1 - aproba@2.0.0: {} + aproba@2.1.0: {} archy@1.0.0: {} @@ -9060,14 +9084,16 @@ snapshots: array-equal@1.0.2: {} - array-includes@3.1.8: + array-includes@3.1.9: dependencies: call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1 + math-intrinsics: 1.1.0 array-initial@1.1.0: dependencies: @@ -9098,14 +9124,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.1 es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.1 es-shim-unscopables: 1.1.0 array.prototype.reduce@1.0.8: @@ -9113,7 +9139,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.1 es-array-method-boxes-properly: 1.0.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 @@ -9124,7 +9150,7 @@ snapshots: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.1 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 @@ -9141,7 +9167,7 @@ snapshots: async-done@1.3.2: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 process-nextick-args: 2.0.1 stream-exhaust: 1.0.2 @@ -9162,8 +9188,8 @@ snapshots: autoprefixer@10.4.13(postcss@8.4.21): dependencies: - browserslist: 4.24.4 - caniuse-lite: 1.0.30001707 + browserslist: 4.28.1 + caniuse-lite: 1.0.30001782 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -9178,11 +9204,11 @@ snapshots: aws4@1.13.2: {} - axios@1.8.4: + axios@1.14.0: dependencies: - follow-redirects: 1.15.9 - form-data: 4.0.2 - proxy-from-env: 1.1.0 + follow-redirects: 1.15.11 + form-data: 4.0.5 + proxy-from-env: 2.1.0 transitivePeerDependencies: - debug @@ -9219,13 +9245,13 @@ snapshots: babel-plugin-import@1.13.6: dependencies: - '@babel/helper-module-imports': 7.25.9 + '@babel/helper-module-imports': 7.28.6 transitivePeerDependencies: - supports-color babel-plugin-istanbul@5.2.0: dependencies: - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 find-up: 3.0.0 istanbul-lib-instrument: 3.3.0 test-exclude: 5.2.3 @@ -9234,7 +9260,7 @@ snapshots: babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.28.6 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -9244,18 +9270,18 @@ snapshots: babel-plugin-jest-hoist@24.9.0: dependencies: - '@types/babel__traverse': 7.20.7 + '@types/babel__traverse': 7.28.0 babel-plugin-jest-hoist@26.6.2: dependencies: - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 '@types/babel__core': 7.20.0 - '@types/babel__traverse': 7.20.7 + '@types/babel__traverse': 7.28.0 babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.20.12): dependencies: - '@babel/compat-data': 7.26.8 + '@babel/compat-data': 7.29.0 '@babel/core': 7.20.12 '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.20.12) semver: 6.3.1 @@ -9266,7 +9292,7 @@ snapshots: dependencies: '@babel/core': 7.20.12 '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.20.12) - core-js-compat: 3.41.0 + core-js-compat: 3.49.0 transitivePeerDependencies: - supports-color @@ -9277,14 +9303,14 @@ snapshots: transitivePeerDependencies: - supports-color - babel-preset-current-node-syntax@1.1.0(@babel/core@7.20.12): + babel-preset-current-node-syntax@1.2.0(@babel/core@7.20.12): dependencies: '@babel/core': 7.20.12 '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.20.12) '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.20.12) '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.20.12) '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.20.12) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.20.12) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.20.12) '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.20.12) '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.20.12) '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.20.12) @@ -9306,7 +9332,7 @@ snapshots: dependencies: '@babel/core': 7.20.12 babel-plugin-jest-hoist: 26.6.2 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.20.12) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.20.12) bach@1.2.0: dependencies: @@ -9322,6 +9348,8 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + base@0.11.2: dependencies: cache-base: 1.0.1 @@ -9332,6 +9360,8 @@ snapshots: mixin-deep: 1.3.2 pascalcase: 0.1.1 + baseline-browser-mapping@2.10.12: {} + bcrypt-pbkdf@1.0.2: dependencies: tweetnacl: 0.14.5 @@ -9352,15 +9382,19 @@ snapshots: boolean@3.2.0: optional: true - brace-expansion@1.1.11: + brace-expansion@1.1.13: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.3: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.5: + dependencies: + balanced-match: 4.0.4 + braces@2.3.2: dependencies: arr-flatten: 1.1.0 @@ -9384,12 +9418,13 @@ snapshots: dependencies: resolve: 1.1.7 - browserslist@4.24.4: + browserslist@4.28.1: dependencies: - caniuse-lite: 1.0.30001707 - electron-to-chromium: 1.5.129 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.4) + baseline-browser-mapping: 2.10.12 + caniuse-lite: 1.0.30001782 + electron-to-chromium: 1.5.329 + node-releases: 2.0.36 + update-browserslist-db: 1.2.3(browserslist@4.28.1) bs-logger@0.2.6: dependencies: @@ -9425,7 +9460,7 @@ snapshots: dependencies: clone-response: 1.0.3 get-stream: 5.2.0 - http-cache-semantics: 4.1.1 + http-cache-semantics: 4.2.0 keyv: 3.1.0 lowercase-keys: 2.0.0 normalize-url: 4.5.1 @@ -9456,12 +9491,12 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001707: {} + caniuse-lite@1.0.30001782: {} canvas@2.11.2: dependencies: '@mapbox/node-pre-gyp': 1.0.11 - nan: 2.22.2 + nan: 2.26.2 simple-get: 3.1.1 transitivePeerDependencies: - encoding @@ -9598,7 +9633,7 @@ snapshots: code-point-at@1.1.0: {} - collect-v8-coverage@1.0.2: {} + collect-v8-coverage@1.0.3: {} collection-map@1.0.0: dependencies: @@ -9626,7 +9661,7 @@ snapshots: color-string@1.9.1: dependencies: color-name: 1.1.4 - simple-swizzle: 0.2.2 + simple-swizzle: 0.2.4 color-support@1.1.3: {} @@ -9707,9 +9742,9 @@ snapshots: each-props: 1.3.2 is-plain-object: 5.0.0 - core-js-compat@3.41.0: + core-js-compat@3.49.0: dependencies: - browserslist: 4.24.4 + browserslist: 4.28.1 core-js@3.31.1: {} @@ -9755,7 +9790,7 @@ snapshots: dependencies: cssom: 0.3.8 - csstype@3.1.3: {} + csstype@3.2.3: {} d3-array@1.2.4: {} @@ -9816,7 +9851,7 @@ snapshots: dependencies: time-zone: 1.0.0 - dayjs@1.11.13: {} + dayjs@1.11.20: {} debug-fabulous@1.1.0: dependencies: @@ -9838,7 +9873,7 @@ snapshots: decamelize@1.2.0: {} - decimal.js@10.5.0: {} + decimal.js@10.6.0: {} decode-uri-component@0.2.2: {} @@ -9899,7 +9934,7 @@ snapshots: detect-file@1.0.0: {} - detect-libc@2.0.3: {} + detect-libc@2.1.2: {} detect-newline@2.1.0: {} @@ -9916,7 +9951,7 @@ snapshots: diff-sequences@27.5.1: {} - diff@4.0.2: {} + diff@4.0.4: {} dir-glob@3.0.1: dependencies: @@ -9932,8 +9967,8 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.27.0 - csstype: 3.1.3 + '@babel/runtime': 7.29.2 + csstype: 3.2.3 dom-serializer@1.4.1: dependencies: @@ -9975,14 +10010,14 @@ snapshots: duplexify@3.7.1: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 inherits: 2.0.4 readable-stream: 2.3.8 stream-shift: 1.0.3 duplexify@4.1.3: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 inherits: 2.0.4 readable-stream: 3.6.2 stream-shift: 1.0.3 @@ -9997,7 +10032,7 @@ snapshots: jsbn: 0.1.1 safer-buffer: 2.1.2 - electron-to-chromium@1.5.129: {} + electron-to-chromium@1.5.329: {} electron@11.5.0: dependencies: @@ -10016,7 +10051,7 @@ snapshots: encodeurl@1.0.2: optional: true - end-of-stream@1.4.4: + end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -10031,11 +10066,11 @@ snapshots: prr: 1.0.1 optional: true - error-ex@1.3.2: + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.9: + es-abstract@1.24.1: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 @@ -10064,7 +10099,9 @@ snapshots: is-array-buffer: 3.0.5 is-callable: 1.2.7 is-data-view: 1.0.2 + is-negative-zero: 2.0.3 is-regex: 1.2.1 + is-set: 2.0.3 is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 @@ -10079,6 +10116,7 @@ snapshots: safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 string.prototype.trim: 1.2.10 string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 @@ -10087,7 +10125,7 @@ snapshots: typed-array-byte-offset: 1.0.4 typed-array-length: 1.0.7 unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 + which-typed-array: 1.1.20 es-array-method-boxes-properly@1.0.0: {} @@ -10268,19 +10306,19 @@ snapshots: eslint-plugin-react@7.30.1(eslint@8.18.0): dependencies: - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.flatmap: 1.3.3 doctrine: 2.1.0 eslint: 8.18.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 + minimatch: 3.1.5 object.entries: 1.1.9 object.fromentries: 2.0.8 object.hasown: 1.1.4 object.values: 1.2.1 prop-types: 15.8.1 - resolve: 2.0.0-next.5 + resolve: 2.0.0-next.6 semver: 6.3.1 string.prototype.matchall: 4.0.12 @@ -10307,7 +10345,7 @@ snapshots: dependencies: '@eslint/eslintrc': 1.4.1 '@humanwhocodes/config-array': 0.9.5 - ajv: 6.12.6 + ajv: 6.14.0 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.3.4 @@ -10317,7 +10355,7 @@ snapshots: eslint-utils: 3.0.0(eslint@8.18.0) eslint-visitor-keys: 3.4.3 espree: 9.6.1 - esquery: 1.6.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 @@ -10328,11 +10366,11 @@ snapshots: import-fresh: 3.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 - js-yaml: 4.1.0 + js-yaml: 4.1.1 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 - minimatch: 3.1.2 + minimatch: 3.1.5 natural-compare: 1.4.0 optionator: 0.9.4 regexpp: 3.2.0 @@ -10352,13 +10390,13 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} - esquery@1.6.0: + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -10503,7 +10541,7 @@ snapshots: fast-levenshtein@2.0.6: {} - fastq@1.19.1: + fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -10577,11 +10615,11 @@ snapshots: flat-cache@3.2.0: dependencies: - flatted: 3.3.3 + flatted: 3.4.2 keyv: 4.5.4 rimraf: 3.0.2 - flatted@3.3.3: {} + flatted@3.4.2: {} flush-write-stream@1.1.1: dependencies: @@ -10592,7 +10630,7 @@ snapshots: dependencies: tslib: 2.8.1 - follow-redirects@1.15.9: {} + follow-redirects@1.15.11: {} for-each@0.3.5: dependencies: @@ -10614,18 +10652,20 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 - form-data@3.0.3: + form-data@3.0.4: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 - form-data@4.0.2: + form-data@4.0.5: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 fraction.js@4.3.7: {} @@ -10637,7 +10677,7 @@ snapshots: fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 fs-extra@8.1.0: @@ -10660,7 +10700,7 @@ snapshots: fsevents@1.2.13: dependencies: bindings: 1.5.0 - nan: 2.22.2 + nan: 2.26.2 optional: true fsevents@2.3.3: @@ -10683,7 +10723,7 @@ snapshots: gauge@3.0.2: dependencies: - aproba: 2.0.0 + aproba: 2.1.0 color-support: 1.1.3 console-control-strings: 1.1.0 has-unicode: 2.0.1 @@ -10693,6 +10733,8 @@ snapshots: strip-ansi: 6.0.1 wide-align: 1.1.5 + generator-function@2.0.1: {} + gensync@1.0.0-beta.2: {} geobuf@3.0.2: @@ -10746,11 +10788,11 @@ snapshots: get-stream@4.1.0: dependencies: - pump: 3.0.2 + pump: 3.0.4 get-stream@5.2.0: dependencies: - pump: 3.0.2 + pump: 3.0.4 get-symbol-description@1.1.0: dependencies: @@ -10792,7 +10834,7 @@ snapshots: readable-stream: 2.3.8 remove-trailing-separator: 1.1.0 to-absolute-glob: 2.0.2 - unique-stream: 2.3.1 + unique-stream: 2.4.0 glob-watcher@5.0.5: dependencies: @@ -10809,7 +10851,7 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.1.2 + minimatch: 3.1.5 once: 1.4.0 path-is-absolute: 1.0.1 @@ -10818,7 +10860,7 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 5.1.6 + minimatch: 5.1.9 once: 1.4.0 global-agent@3.0.0: @@ -10853,8 +10895,6 @@ snapshots: tunnel: 0.0.6 optional: true - globals@11.12.0: {} - globals@13.24.0: dependencies: type-fest: 0.20.2 @@ -10935,11 +10975,11 @@ snapshots: gulp-match@1.1.0: dependencies: - minimatch: 3.1.2 + minimatch: 3.1.5 gulp-replace@1.1.4: dependencies: - '@types/node': 22.13.17 + '@types/node': 25.5.0 '@types/vinyl': 2.0.7 istextorbinary: 3.3.0 replacestream: 4.0.3 @@ -10963,7 +11003,7 @@ snapshots: dependencies: ansi-colors: 4.1.3 plugin-error: 1.0.1 - source-map: 0.7.4 + source-map: 0.7.6 through2: 3.0.2 typescript: 4.9.5 vinyl: 2.2.1 @@ -10986,7 +11026,7 @@ snapshots: har-validator@5.1.5: dependencies: - ajv: 6.12.6 + ajv: 6.14.0 har-schema: 2.0.0 has-bigints@1.1.0: {} @@ -11059,7 +11099,7 @@ snapshots: domutils: 2.8.0 entities: 2.2.0 - http-cache-semantics@4.1.1: {} + http-cache-semantics@4.2.0: {} http-proxy-agent@4.0.1: dependencies: @@ -11153,7 +11193,7 @@ snapshots: is-arrayish@0.2.1: {} - is-arrayish@0.3.2: {} + is-arrayish@0.3.4: {} is-async-function@2.1.1: dependencies: @@ -11245,9 +11285,10 @@ snapshots: is-generator-fn@2.1.0: {} - is-generator-function@1.1.0: + is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 + generator-function: 2.0.1 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -11266,6 +11307,8 @@ snapshots: is-negated-glob@1.0.0: {} + is-negative-zero@2.0.3: {} + is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -11291,7 +11334,7 @@ snapshots: is-reference@1.2.1: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 is-regex@1.2.1: dependencies: @@ -11327,7 +11370,7 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.19 + which-typed-array: 1.1.20 is-typedarray@1.0.0: {} @@ -11381,10 +11424,10 @@ snapshots: istanbul-lib-instrument@3.3.0: dependencies: '@babel/generator': 7.21.1 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.29.2 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 istanbul-lib-coverage: 2.0.5 semver: 6.3.1 transitivePeerDependencies: @@ -11402,7 +11445,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.20.12 - '@babel/parser': 7.27.0 + '@babel/parser': 7.29.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -11423,7 +11466,7 @@ snapshots: transitivePeerDependencies: - supports-color - istanbul-reports@3.1.7: + istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 @@ -11439,9 +11482,9 @@ snapshots: execa: 4.1.0 throat: 5.0.0 - jest-cli@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)): + jest-cli@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)): dependencies: - '@jest/core': 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + '@jest/core': 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 chalk: 4.1.2 @@ -11449,7 +11492,7 @@ snapshots: graceful-fs: 4.2.11 import-local: 3.2.0 is-ci: 2.0.0 - jest-config: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest-config: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-util: 26.6.2 jest-validate: 26.6.2 prompts: 2.4.2 @@ -11461,9 +11504,9 @@ snapshots: - ts-node - utf-8-validate - jest-cli@26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)): + jest-cli@26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)): dependencies: - '@jest/core': 26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + '@jest/core': 26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 chalk: 4.1.2 @@ -11471,7 +11514,7 @@ snapshots: graceful-fs: 4.2.11 import-local: 3.2.0 is-ci: 2.0.0 - jest-config: 26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest-config: 26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-util: 26.6.2 jest-validate: 26.6.2 prompts: 2.4.2 @@ -11505,10 +11548,10 @@ snapshots: transitivePeerDependencies: - supports-color - jest-config@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)): + jest-config@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)): dependencies: '@babel/core': 7.20.12 - '@jest/test-sequencer': 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + '@jest/test-sequencer': 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) '@jest/types': 26.6.2 babel-jest: 26.6.3(@babel/core@7.20.12) chalk: 4.1.2 @@ -11518,7 +11561,7 @@ snapshots: jest-environment-jsdom: 26.6.2(canvas@2.11.2) jest-environment-node: 26.6.2 jest-get-type: 26.3.0 - jest-jasmine2: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest-jasmine2: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-regex-util: 26.0.0 jest-resolve: 26.6.2 jest-util: 26.6.2 @@ -11526,17 +11569,17 @@ snapshots: micromatch: 4.0.8 pretty-format: 26.6.2 optionalDependencies: - ts-node: 10.9.0(@types/node@22.13.17)(typescript@4.9.5) + ts-node: 10.9.0(@types/node@25.5.0)(typescript@4.9.5) transitivePeerDependencies: - bufferutil - canvas - supports-color - utf-8-validate - jest-config@26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)): + jest-config@26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)): dependencies: '@babel/core': 7.20.12 - '@jest/test-sequencer': 26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + '@jest/test-sequencer': 26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) '@jest/types': 26.6.2 babel-jest: 26.6.3(@babel/core@7.20.12) chalk: 4.1.2 @@ -11546,7 +11589,7 @@ snapshots: jest-environment-jsdom: 26.6.2(canvas@2.11.2) jest-environment-node: 26.6.2 jest-get-type: 26.3.0 - jest-jasmine2: 26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest-jasmine2: 26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-regex-util: 26.0.0 jest-resolve: 26.6.2 jest-util: 26.6.2 @@ -11554,7 +11597,7 @@ snapshots: micromatch: 4.0.8 pretty-format: 26.6.2 optionalDependencies: - ts-node: 10.9.0(@types/node@22.13.17)(typescript@4.9.5) + ts-node: 10.9.0(@types/node@25.5.0)(typescript@4.9.5) transitivePeerDependencies: - bufferutil - canvas @@ -11606,10 +11649,10 @@ snapshots: jest-util: 26.6.2 pretty-format: 26.6.2 - jest-electron@0.1.12(jest@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5))): + jest-electron@0.1.12(jest@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5))): dependencies: electron: 11.5.0 - jest: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-haste-map: 24.9.0 jest-message-util: 24.9.0 jest-mock: 24.9.0 @@ -11622,10 +11665,10 @@ snapshots: transitivePeerDependencies: - supports-color - jest-electron@0.1.12(jest@26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5))): + jest-electron@0.1.12(jest@26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5))): dependencies: electron: 11.5.0 - jest: 26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest: 26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-haste-map: 24.9.0 jest-message-util: 24.9.0 jest-mock: 24.9.0 @@ -11654,7 +11697,7 @@ snapshots: '@jest/environment': 26.6.2 '@jest/fake-timers': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.13.17 + '@types/node': 25.5.0 jest-mock: 26.6.2 jest-util: 26.6.2 jsdom: 16.7.0(canvas@2.11.2) @@ -11679,7 +11722,7 @@ snapshots: '@jest/environment': 26.6.2 '@jest/fake-timers': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.13.17 + '@types/node': 25.5.0 jest-mock: 26.6.2 jest-util: 26.6.2 @@ -11716,7 +11759,7 @@ snapshots: dependencies: '@jest/types': 26.6.2 '@types/graceful-fs': 4.1.9 - '@types/node': 22.13.17 + '@types/node': 25.5.0 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -11732,7 +11775,7 @@ snapshots: jest-jasmine2@24.9.0: dependencies: - '@babel/traverse': 7.27.0 + '@babel/traverse': 7.29.0 '@jest/environment': 24.9.0 '@jest/test-result': 24.9.0 '@jest/types': 24.9.0 @@ -11751,14 +11794,14 @@ snapshots: transitivePeerDependencies: - supports-color - jest-jasmine2@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)): + jest-jasmine2@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)): dependencies: - '@babel/traverse': 7.27.0 + '@babel/traverse': 7.29.0 '@jest/environment': 26.6.2 '@jest/source-map': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.13.17 + '@types/node': 25.5.0 chalk: 4.1.2 co: 4.6.0 expect: 26.6.2 @@ -11766,7 +11809,7 @@ snapshots: jest-each: 26.6.2 jest-matcher-utils: 26.6.2 jest-message-util: 26.6.2 - jest-runtime: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest-runtime: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-snapshot: 26.6.2 jest-util: 26.6.2 pretty-format: 26.6.2 @@ -11778,14 +11821,14 @@ snapshots: - ts-node - utf-8-validate - jest-jasmine2@26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)): + jest-jasmine2@26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)): dependencies: - '@babel/traverse': 7.27.0 + '@babel/traverse': 7.29.0 '@jest/environment': 26.6.2 '@jest/source-map': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.13.17 + '@types/node': 25.5.0 chalk: 4.1.2 co: 4.6.0 expect: 26.6.2 @@ -11793,7 +11836,7 @@ snapshots: jest-each: 26.6.2 jest-matcher-utils: 26.6.2 jest-message-util: 26.6.2 - jest-runtime: 26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest-runtime: 26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-snapshot: 26.6.2 jest-util: 26.6.2 pretty-format: 26.6.2 @@ -11838,7 +11881,7 @@ snapshots: jest-message-util@24.9.0: dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.29.0 '@jest/test-result': 24.9.0 '@jest/types': 24.9.0 '@types/stack-utils': 1.0.1 @@ -11849,7 +11892,7 @@ snapshots: jest-message-util@26.6.2: dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.29.0 '@jest/types': 26.6.2 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -11866,7 +11909,7 @@ snapshots: jest-mock@26.6.2: dependencies: '@jest/types': 26.6.2 - '@types/node': 22.13.17 + '@types/node': 25.5.0 jest-pnp-resolver@1.2.3(jest-resolve@24.9.0): optionalDependencies: @@ -11902,7 +11945,7 @@ snapshots: jest-pnp-resolver: 1.2.3(jest-resolve@26.6.2) jest-util: 26.6.2 read-pkg-up: 7.0.1 - resolve: 1.22.10 + resolve: 1.22.11 slash: 3.0.0 jest-runner@24.9.0: @@ -11929,24 +11972,24 @@ snapshots: transitivePeerDependencies: - supports-color - jest-runner@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)): + jest-runner@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)): dependencies: '@jest/console': 26.6.2 '@jest/environment': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.13.17 + '@types/node': 25.5.0 chalk: 4.1.2 emittery: 0.7.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest-config: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-docblock: 26.0.0 jest-haste-map: 26.6.2 jest-leak-detector: 26.6.2 jest-message-util: 26.6.2 jest-resolve: 26.6.2 - jest-runtime: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest-runtime: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-util: 26.6.2 jest-worker: 26.6.2 source-map-support: 0.5.21 @@ -11958,24 +12001,24 @@ snapshots: - ts-node - utf-8-validate - jest-runner@26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)): + jest-runner@26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)): dependencies: '@jest/console': 26.6.2 '@jest/environment': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.13.17 + '@types/node': 25.5.0 chalk: 4.1.2 emittery: 0.7.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest-config: 26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-docblock: 26.0.0 jest-haste-map: 26.6.2 jest-leak-detector: 26.6.2 jest-message-util: 26.6.2 jest-resolve: 26.6.2 - jest-runtime: 26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest-runtime: 26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-util: 26.6.2 jest-worker: 26.6.2 source-map-support: 0.5.21 @@ -12015,7 +12058,7 @@ snapshots: transitivePeerDependencies: - supports-color - jest-runtime@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)): + jest-runtime@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)): dependencies: '@jest/console': 26.6.2 '@jest/environment': 26.6.2 @@ -12025,14 +12068,14 @@ snapshots: '@jest/test-result': 26.6.2 '@jest/transform': 26.6.2 '@jest/types': 26.6.2 - '@types/yargs': 15.0.19 + '@types/yargs': 15.0.20 chalk: 4.1.2 cjs-module-lexer: 0.6.0 - collect-v8-coverage: 1.0.2 + collect-v8-coverage: 1.0.3 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 - jest-config: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest-config: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-haste-map: 26.6.2 jest-message-util: 26.6.2 jest-mock: 26.6.2 @@ -12051,7 +12094,7 @@ snapshots: - ts-node - utf-8-validate - jest-runtime@26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)): + jest-runtime@26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)): dependencies: '@jest/console': 26.6.2 '@jest/environment': 26.6.2 @@ -12061,14 +12104,14 @@ snapshots: '@jest/test-result': 26.6.2 '@jest/transform': 26.6.2 '@jest/types': 26.6.2 - '@types/yargs': 15.0.19 + '@types/yargs': 15.0.20 chalk: 4.1.2 cjs-module-lexer: 0.6.0 - collect-v8-coverage: 1.0.2 + collect-v8-coverage: 1.0.3 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 - jest-config: 26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest-config: 26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-haste-map: 26.6.2 jest-message-util: 26.6.2 jest-mock: 26.6.2 @@ -12091,12 +12134,12 @@ snapshots: jest-serializer@26.6.2: dependencies: - '@types/node': 22.13.17 + '@types/node': 25.5.0 graceful-fs: 4.2.11 jest-snapshot@24.9.0: dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.29.0 '@jest/types': 24.9.0 chalk: 2.4.2 expect: 24.9.0 @@ -12112,9 +12155,9 @@ snapshots: jest-snapshot@26.6.2: dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.29.0 '@jest/types': 26.6.2 - '@types/babel__traverse': 7.20.7 + '@types/babel__traverse': 7.28.0 '@types/prettier': 2.7.3 chalk: 4.1.2 expect: 26.6.2 @@ -12147,7 +12190,7 @@ snapshots: jest-util@26.6.2: dependencies: '@jest/types': 26.6.2 - '@types/node': 22.13.17 + '@types/node': 25.5.0 chalk: 4.1.2 graceful-fs: 4.2.11 is-ci: 2.0.0 @@ -12175,7 +12218,7 @@ snapshots: dependencies: '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 22.13.17 + '@types/node': 25.5.0 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 26.6.2 @@ -12188,15 +12231,15 @@ snapshots: jest-worker@26.6.2: dependencies: - '@types/node': 22.13.17 + '@types/node': 25.5.0 merge-stream: 2.0.0 supports-color: 7.2.0 - jest@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)): + jest@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)): dependencies: - '@jest/core': 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + '@jest/core': 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) import-local: 3.2.0 - jest-cli: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest-cli: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) transitivePeerDependencies: - bufferutil - canvas @@ -12204,11 +12247,11 @@ snapshots: - ts-node - utf-8-validate - jest@26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)): + jest@26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)): dependencies: - '@jest/core': 26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + '@jest/core': 26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) import-local: 3.2.0 - jest-cli: 26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest-cli: 26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) transitivePeerDependencies: - bufferutil - canvas @@ -12222,12 +12265,12 @@ snapshots: js-tokens@4.0.0: {} - js-yaml@3.14.1: + js-yaml@3.14.2: dependencies: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.0: + js-yaml@4.1.1: dependencies: argparse: 2.0.1 @@ -12246,12 +12289,12 @@ snapshots: escodegen: 1.14.3 html-encoding-sniffer: 1.0.2 left-pad: 1.3.0 - nwsapi: 2.2.20 + nwsapi: 2.2.23 parse5: 4.0.0 pn: 1.1.0 request: 2.88.2 request-promise-native: 1.0.9(request@2.88.2) - sax: 1.4.1 + sax: 1.6.0 symbol-tree: 3.2.4 tough-cookie: 2.5.0 w3c-hr-time: 1.0.2 @@ -12265,20 +12308,20 @@ snapshots: jsdom@16.7.0(canvas@2.11.2): dependencies: abab: 2.0.6 - acorn: 8.14.1 + acorn: 8.16.0 acorn-globals: 6.0.0 cssom: 0.4.4 cssstyle: 2.3.0 data-urls: 2.0.0 - decimal.js: 10.5.0 + decimal.js: 10.6.0 domexception: 2.0.1 escodegen: 2.1.0 - form-data: 3.0.3 + form-data: 3.0.4 html-encoding-sniffer: 2.0.1 http-proxy-agent: 4.0.1 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.20 + nwsapi: 2.2.23 parse5: 6.0.1 saxes: 5.0.1 symbol-tree: 3.2.4 @@ -12300,8 +12343,6 @@ snapshots: jsesc@2.5.2: {} - jsesc@3.0.2: {} - jsesc@3.1.0: {} json-buffer@3.0.0: {} @@ -12326,7 +12367,7 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonfile@6.1.0: + jsonfile@6.2.0: dependencies: universalify: 2.0.1 optionalDependencies: @@ -12341,7 +12382,7 @@ snapshots: jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.flat: 1.3.3 object.assign: 4.1.7 object.values: 1.2.1 @@ -12402,7 +12443,7 @@ snapshots: image-size: 0.5.5 make-dir: 2.1.0 mime: 1.6.0 - needle: 3.3.1 + needle: 3.5.0 source-map: 0.6.1 leven@3.1.0: {} @@ -12426,7 +12467,7 @@ snapshots: is-plain-object: 2.0.4 object.map: 1.0.1 rechoir: 0.6.2 - resolve: 1.22.10 + resolve: 1.22.11 lil-gui@0.17.0: {} @@ -12474,7 +12515,7 @@ snapshots: dependencies: js-tokens: 4.0.0 - lottie-web@5.12.2: {} + lottie-web@5.13.0: {} loupe@2.3.7: dependencies: @@ -12498,11 +12539,11 @@ snapshots: magic-string@0.27.0: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 - magic-string@0.30.17: + magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 make-dir@2.1.0: dependencies: @@ -12516,7 +12557,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.4 make-error@1.3.6: {} @@ -12548,7 +12589,7 @@ snapshots: dependencies: findup-sync: 2.0.0 micromatch: 3.1.10 - resolve: 1.22.10 + resolve: 1.22.11 stack-trace: 0.0.10 matcher@3.0.0: @@ -12598,7 +12639,7 @@ snapshots: micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 2.3.1 + picomatch: 2.3.2 mime-db@1.52.0: {} @@ -12617,13 +12658,17 @@ snapshots: mimic-response@2.1.0: {} - minimatch@3.1.2: + minimatch@10.2.5: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 5.0.5 - minimatch@5.1.6: + minimatch@3.1.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 1.1.13 + + minimatch@5.1.9: + dependencies: + brace-expansion: 2.0.3 minimist@1.2.0: {} @@ -12653,12 +12698,12 @@ snapshots: mkdirp@1.0.4: {} - mlly@1.7.4: + mlly@1.8.2: dependencies: - acorn: 8.14.1 + acorn: 8.16.0 pathe: 2.0.3 pkg-types: 1.3.1 - ufo: 1.5.4 + ufo: 1.6.3 ms@2.0.0: {} @@ -12668,7 +12713,7 @@ snapshots: mute-stdout@1.0.1: {} - nan@2.22.2: {} + nan@2.26.2: {} nanoid@3.3.11: {} @@ -12688,16 +12733,23 @@ snapshots: natural-compare@1.4.0: {} - needle@3.3.1: + needle@3.5.0: dependencies: iconv-lite: 0.6.3 - sax: 1.4.1 + sax: 1.6.0 optional: true next-tick@1.1.0: {} nice-try@1.0.5: {} + node-exports-info@1.6.0: + dependencies: + array.prototype.flatmap: 1.3.3 + es-errors: 1.3.0 + object.entries: 1.1.9 + semver: 6.3.1 + node-fetch@2.6.6: dependencies: whatwg-url: 5.0.0 @@ -12718,7 +12770,7 @@ snapshots: which: 2.0.2 optional: true - node-releases@2.0.19: {} + node-releases@2.0.36: {} nopt@5.0.0: dependencies: @@ -12727,7 +12779,7 @@ snapshots: normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.10 + resolve: 1.22.11 semver: 5.7.2 validate-npm-package-license: 3.0.4 @@ -12770,7 +12822,7 @@ snapshots: number-precision@1.6.0: {} - nwsapi@2.2.20: {} + nwsapi@2.2.23: {} oauth-sign@0.9.0: {} @@ -12817,15 +12869,15 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 - object.getownpropertydescriptors@2.1.8: + object.getownpropertydescriptors@2.1.9: dependencies: array.prototype.reduce: 1.0.8 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 gopd: 1.2.0 safe-array-concat: 1.1.3 @@ -12833,7 +12885,7 @@ snapshots: object.hasown@1.1.4: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 object.map@1.0.1: @@ -12915,7 +12967,7 @@ snapshots: p-limit@4.0.0: dependencies: - yocto-queue: 1.2.1 + yocto-queue: 1.2.2 p-locate@3.0.0: dependencies: @@ -12939,17 +12991,17 @@ snapshots: parse-json@2.2.0: dependencies: - error-ex: 1.3.2 + error-ex: 1.3.4 parse-json@4.0.0: dependencies: - error-ex: 1.3.2 + error-ex: 1.3.4 json-parse-better-errors: 1.0.2 parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.26.2 - error-ex: 1.3.2 + '@babel/code-frame': 7.29.0 + error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -13029,9 +13081,9 @@ snapshots: picocolors@1.1.1: {} - picomatch@2.3.1: {} + picomatch@2.3.2: {} - picomatch@4.0.2: {} + picomatch@4.0.4: {} pify@2.3.0: {} @@ -13055,7 +13107,7 @@ snapshots: pkg-types@1.3.1: dependencies: confbox: 0.1.8 - mlly: 1.7.4 + mlly: 1.8.2 pathe: 2.0.3 plugin-error@0.1.2: @@ -13153,7 +13205,7 @@ snapshots: protocol-buffers-schema@3.6.0: {} - proxy-from-env@1.1.0: {} + proxy-from-env@2.1.0: {} prr@1.0.1: optional: true @@ -13164,12 +13216,12 @@ snapshots: pump@2.0.1: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 - pump@3.0.2: + pump@3.0.4: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 pumpify@1.5.1: @@ -13180,7 +13232,7 @@ snapshots: punycode@2.3.1: {} - qs@6.5.3: {} + qs@6.5.5: {} querystringify@2.2.0: {} @@ -13190,9 +13242,9 @@ snapshots: dependencies: safe-buffer: 5.2.1 - react-clientside-effect@1.2.7(react@18.3.1): + react-clientside-effect@1.2.8(react@18.3.1): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.29.2 react: 18.3.1 react-dom@18.3.1(react@18.3.1): @@ -13201,17 +13253,17 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-focus-lock@2.13.6(@types/react@18.3.20)(react@18.3.1): + react-focus-lock@2.13.7(@types/react@18.3.28)(react@18.3.1): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.29.2 focus-lock: 1.3.6 prop-types: 15.8.1 react: 18.3.1 - react-clientside-effect: 1.2.7(react@18.3.1) - use-callback-ref: 1.3.3(@types/react@18.3.20)(react@18.3.1) - use-sidecar: 1.1.3(@types/react@18.3.20)(react@18.3.1) + react-clientside-effect: 1.2.8(react@18.3.1) + use-callback-ref: 1.3.3(@types/react@18.3.28)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@18.3.28)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.20 + '@types/react': 18.3.28 react-is@16.13.1: {} @@ -13239,7 +13291,7 @@ snapshots: react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.29.2 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -13316,7 +13368,7 @@ snapshots: readdirp@3.6.0: dependencies: - picomatch: 2.3.1 + picomatch: 2.3.2 realpath-native@1.1.0: dependencies: @@ -13324,31 +13376,25 @@ snapshots: rechoir@0.6.2: dependencies: - resolve: 1.22.10 + resolve: 1.22.11 reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 - regenerate-unicode-properties@10.2.0: + regenerate-unicode-properties@10.2.2: dependencies: regenerate: 1.4.2 regenerate@1.4.2: {} - regenerator-runtime@0.14.1: {} - - regenerator-transform@0.15.2: - dependencies: - '@babel/runtime': 7.27.0 - regex-not@1.0.2: dependencies: extend-shallow: 3.0.2 @@ -13365,20 +13411,20 @@ snapshots: regexpp@3.2.0: {} - regexpu-core@6.2.0: + regexpu-core@6.4.0: dependencies: regenerate: 1.4.2 - regenerate-unicode-properties: 10.2.0 + regenerate-unicode-properties: 10.2.2 regjsgen: 0.8.0 - regjsparser: 0.12.0 + regjsparser: 0.13.0 unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.2.0 + unicode-match-property-value-ecmascript: 2.2.1 regjsgen@0.8.0: {} - regjsparser@0.12.0: + regjsparser@0.13.0: dependencies: - jsesc: 3.0.2 + jsesc: 3.1.0 remove-bom-buffer@3.0.0: dependencies: @@ -13440,7 +13486,7 @@ snapshots: mime-types: 2.1.35 oauth-sign: 0.9.0 performance-now: 2.1.0 - qs: 6.5.3 + qs: 6.5.5 safe-buffer: 5.2.1 tough-cookie: 2.5.0 tunnel-agent: 0.6.0 @@ -13481,15 +13527,18 @@ snapshots: resolve@1.1.7: {} - resolve@1.22.10: + resolve@1.22.11: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.5: + resolve@2.0.0-next.6: dependencies: + es-errors: 1.3.0 is-core-module: 2.16.1 + node-exports-info: 1.6.0 + object-keys: 1.1.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -13527,13 +13576,13 @@ snapshots: rollup-plugin-visualizer@5.9.2(rollup@3.20.5): dependencies: open: 8.4.2 - picomatch: 2.3.1 - source-map: 0.7.4 + picomatch: 2.3.2 + source-map: 0.7.6 yargs: 17.7.2 optionalDependencies: rollup: 3.20.5 - rollup@2.79.2: + rollup@2.80.0: optionalDependencies: fsevents: 2.3.3 @@ -13597,7 +13646,7 @@ snapshots: minimist: 1.2.8 walker: 1.0.8 - sax@1.4.1: {} + sax@1.6.0: {} saxes@5.0.1: dependencies: @@ -13626,7 +13675,7 @@ snapshots: dependencies: lru-cache: 6.0.0 - semver@7.7.1: {} + semver@7.7.4: {} serialize-error@7.0.1: dependencies: @@ -13734,11 +13783,11 @@ snapshots: once: 1.4.0 simple-concat: 1.0.1 - simple-statistics@7.8.8: {} + simple-statistics@7.8.9: {} - simple-swizzle@0.2.2: + simple-swizzle@0.2.4: dependencies: - is-arrayish: 0.3.2 + is-arrayish: 0.3.4 simplify-geojson@1.0.5: dependencies: @@ -13807,23 +13856,23 @@ snapshots: source-map@0.6.1: {} - source-map@0.7.4: {} + source-map@0.7.6: {} sparkles@1.0.1: {} spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.21 + spdx-license-ids: 3.0.23 spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.21 + spdx-license-ids: 3.0.23 - spdx-license-ids@3.0.21: {} + spdx-license-ids@3.0.23: {} split-string@3.1.0: dependencies: @@ -13863,10 +13912,15 @@ snapshots: define-property: 0.2.5 object-copy: 0.1.0 - std-env@3.8.1: {} + std-env@3.10.0: {} stealthy-require@1.1.1: {} + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + stream-exhaust@1.0.2: {} stream-shift@1.0.3: {} @@ -13901,7 +13955,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -13918,7 +13972,7 @@ snapshots: call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 @@ -13975,7 +14029,7 @@ snapshots: strip-literal@1.3.0: dependencies: - acorn: 8.14.1 + acorn: 8.16.0 sumchecker@3.0.1: dependencies: @@ -14032,15 +14086,15 @@ snapshots: terser@5.17.1: dependencies: - '@jridgewell/source-map': 0.3.6 - acorn: 8.14.1 + '@jridgewell/source-map': 0.3.11 + acorn: 8.16.0 commander: 2.20.3 source-map-support: 0.5.21 test-exclude@5.2.3: dependencies: glob: 7.2.3 - minimatch: 3.1.2 + minimatch: 3.1.5 read-pkg-up: 4.0.0 require-main-filename: 2.0.0 @@ -14048,7 +14102,7 @@ snapshots: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 - minimatch: 3.1.2 + minimatch: 3.1.5 text-encoding@0.6.4: {} @@ -14157,12 +14211,12 @@ snapshots: dependencies: punycode: 2.3.1 - ts-jest@26.5.6(jest@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)))(typescript@4.9.5): + ts-jest@26.5.6(jest@26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)))(typescript@4.9.5): dependencies: bs-logger: 0.2.6 buffer-from: 1.1.2 fast-json-stable-stringify: 2.1.0 - jest: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest: 26.6.3(canvas@2.11.2)(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-util: 26.6.2 json5: 2.2.3 lodash: 4.17.21 @@ -14172,12 +14226,12 @@ snapshots: typescript: 4.9.5 yargs-parser: 20.2.9 - ts-jest@26.5.6(jest@26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)))(typescript@4.9.5): + ts-jest@26.5.6(jest@26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)))(typescript@4.9.5): dependencies: bs-logger: 0.2.6 buffer-from: 1.1.2 fast-json-stable-stringify: 2.1.0 - jest: 26.6.3(ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5)) + jest: 26.6.3(ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5)) jest-util: 26.6.2 json5: 2.2.3 lodash: 4.17.21 @@ -14187,19 +14241,19 @@ snapshots: typescript: 4.9.5 yargs-parser: 20.2.9 - ts-node@10.9.0(@types/node@22.13.17)(typescript@4.9.5): + ts-node@10.9.0(@types/node@25.5.0)(typescript@4.9.5): dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 + '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.13.17 - acorn: 8.14.1 - acorn-walk: 8.3.4 + '@types/node': 25.5.0 + acorn: 8.16.0 + acorn-walk: 8.3.5 arg: 4.1.3 create-require: 1.1.1 - diff: 4.0.2 + diff: 4.0.4 make-error: 1.3.6 typescript: 4.9.5 v8-compile-cache-lib: 3.0.1 @@ -14293,7 +14347,7 @@ snapshots: uc.micro@1.0.6: {} - ufo@1.5.4: {} + ufo@1.6.3: {} unbox-primitive@1.1.0: dependencies: @@ -14319,18 +14373,18 @@ snapshots: object.reduce: 1.0.1 undertaker-registry: 1.0.1 - undici-types@6.20.0: {} + undici-types@7.18.2: {} unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-match-property-ecmascript@2.0.0: dependencies: unicode-canonical-property-names-ecmascript: 2.0.1 - unicode-property-aliases-ecmascript: 2.1.0 + unicode-property-aliases-ecmascript: 2.2.0 - unicode-match-property-value-ecmascript@2.2.0: {} + unicode-match-property-value-ecmascript@2.2.1: {} - unicode-property-aliases-ecmascript@2.1.0: {} + unicode-property-aliases-ecmascript@2.2.0: {} union-value@1.0.1: dependencies: @@ -14339,7 +14393,7 @@ snapshots: is-extendable: 0.1.1 set-value: 2.0.1 - unique-stream@2.3.1: + unique-stream@2.4.0: dependencies: json-stable-stringify-without-jsonify: 1.0.1 through2-filter: 3.0.0 @@ -14357,9 +14411,9 @@ snapshots: upath@1.2.0: {} - update-browserslist-db@1.1.3(browserslist@4.24.4): + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: - browserslist: 4.24.4 + browserslist: 4.28.1 escalade: 3.2.0 picocolors: 1.1.1 @@ -14378,20 +14432,20 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - use-callback-ref@1.3.3(@types/react@18.3.20)(react@18.3.1): + use-callback-ref@1.3.3(@types/react@18.3.28)(react@18.3.1): dependencies: react: 18.3.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 18.3.20 + '@types/react': 18.3.28 - use-sidecar@1.1.3(@types/react@18.3.20)(react@18.3.1): + use-sidecar@1.1.3(@types/react@18.3.28)(react@18.3.1): dependencies: detect-node-es: 1.1.0 react: 18.3.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 18.3.20 + '@types/react': 18.3.28 use@3.1.1: {} @@ -14409,7 +14463,7 @@ snapshots: get-intrinsic: 1.3.0 has-proto: 1.2.0 has-symbols: 1.1.0 - object.getownpropertydescriptors: 2.1.8 + object.getownpropertydescriptors: 2.1.9 safe-array-concat: 1.1.3 uuid@3.4.0: {} @@ -14425,7 +14479,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 1.9.0 - source-map: 0.7.4 + source-map: 0.7.6 v8flags@3.2.0: dependencies: @@ -14483,14 +14537,14 @@ snapshots: remove-trailing-separator: 1.1.0 replace-ext: 1.0.1 - vite-node@0.30.1(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1): + vite-node@0.30.1(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1): dependencies: cac: 6.7.14 debug: 4.3.4 - mlly: 1.7.4 + mlly: 1.8.2 pathe: 1.1.2 picocolors: 1.1.1 - vite: 3.2.6(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1) + vite: 3.2.6(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1) transitivePeerDependencies: - '@types/node' - less @@ -14500,14 +14554,14 @@ snapshots: - supports-color - terser - vite@3.2.6(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1): + vite@3.2.6(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1): dependencies: esbuild: 0.15.18 postcss: 8.4.21 - resolve: 1.22.10 - rollup: 2.79.2 + resolve: 1.22.11 + rollup: 2.80.0 optionalDependencies: - '@types/node': 22.13.17 + '@types/node': 25.5.0 fsevents: 2.3.3 less: 4.1.3 terser: 5.17.1 @@ -14516,29 +14570,29 @@ snapshots: dependencies: '@types/chai': 4.3.20 '@types/chai-subset': 1.3.6(@types/chai@4.3.20) - '@types/node': 22.13.17 + '@types/node': 25.5.0 '@vitest/expect': 0.30.1 '@vitest/runner': 0.30.1 '@vitest/snapshot': 0.30.1 '@vitest/spy': 0.30.1 '@vitest/utils': 0.30.1 - acorn: 8.14.1 - acorn-walk: 8.3.4 + acorn: 8.16.0 + acorn-walk: 8.3.5 cac: 6.7.14 chai: 4.5.0 concordance: 5.0.4 debug: 4.3.4 local-pkg: 0.4.3 - magic-string: 0.30.17 + magic-string: 0.30.21 pathe: 1.1.2 picocolors: 1.1.1 source-map: 0.6.1 - std-env: 3.8.1 + std-env: 3.10.0 strip-literal: 1.3.0 tinybench: 2.9.0 tinypool: 0.4.0 - vite: 3.2.6(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1) - vite-node: 0.30.1(@types/node@22.13.17)(less@4.1.3)(terser@5.17.1) + vite: 3.2.6(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1) + vite-node: 0.30.1(@types/node@25.5.0)(less@4.1.3)(terser@5.17.1) why-is-node-running: 2.3.0 optionalDependencies: jsdom: 16.7.0(canvas@2.11.2) @@ -14617,13 +14671,13 @@ snapshots: is-async-function: 2.1.1 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 + is-generator-function: 1.1.2 is-regex: 1.2.1 is-weakref: 1.1.1 isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.19 + which-typed-array: 1.1.20 which-collection@1.0.2: dependencies: @@ -14636,7 +14690,7 @@ snapshots: which-module@2.0.1: {} - which-typed-array@1.1.19: + which-typed-array@1.1.20: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 @@ -14804,4 +14858,4 @@ snapshots: yn@3.1.1: {} - yocto-queue@1.2.1: {} + yocto-queue@1.2.2: {} diff --git a/docs/assets/changelog/en/changelog.md b/docs/assets/changelog/en/changelog.md index f01f887f8..484791e92 100644 --- a/docs/assets/changelog/en/changelog.md +++ b/docs/assets/changelog/en/changelog.md @@ -1,3 +1,14 @@ +# v1.0.43 + +2026-03-25 + + +**🐛 Bug fix** + +- **@visactor/vrender-components**: add datazoom graphic layout level to render right level when update data. fix @VisActor/VChart[#4186](https://github.com/VisActor/VRender/issues/4186) + +[more detail about v1.0.43](https://github.com/VisActor/VRender/releases/tag/v1.0.43) + # v1.0.42 2026-03-23 diff --git a/docs/assets/changelog/zh/changelog.md b/docs/assets/changelog/zh/changelog.md index 2109a7ed3..6d850a3c2 100644 --- a/docs/assets/changelog/zh/changelog.md +++ b/docs/assets/changelog/zh/changelog.md @@ -1,3 +1,14 @@ +# v1.0.43 + +2026-03-25 + + +**🐛 功能修复** + +- **@visactor/vrender-components**: add datazoom graphic layout level to render right level when update data. fix @VisActor/VChart[#4186](https://github.com/VisActor/VRender/issues/4186) + +[更多详情请查看 v1.0.43](https://github.com/VisActor/VRender/releases/tag/v1.0.43) + # v1.0.42 2026-03-23 diff --git a/packages/react-vrender-utils/CHANGELOG.json b/packages/react-vrender-utils/CHANGELOG.json index 79c0e1cfd..038f19f64 100644 --- a/packages/react-vrender-utils/CHANGELOG.json +++ b/packages/react-vrender-utils/CHANGELOG.json @@ -4,11 +4,7 @@ { "version": "1.0.43", "tag": "@visactor/react-vrender-utils_v1.0.43", -<<<<<<< release/1.0.44 - "date": "Wed, 25 Mar 2026 09:15:13 GMT", -======= - "date": "Tue, 24 Mar 2026 13:05:47 GMT", ->>>>>>> main + "date": "Thu, 02 Apr 2026 03:43:37 GMT", "comments": {} }, { diff --git a/packages/react-vrender-utils/CHANGELOG.md b/packages/react-vrender-utils/CHANGELOG.md index bef57993b..ef068cb76 100644 --- a/packages/react-vrender-utils/CHANGELOG.md +++ b/packages/react-vrender-utils/CHANGELOG.md @@ -1,16 +1,9 @@ # Change Log - @visactor/react-vrender-utils -<<<<<<< release/1.0.44 -This log was last generated on Wed, 25 Mar 2026 09:15:13 GMT and should not be manually modified. +This log was last generated on Thu, 02 Apr 2026 03:43:37 GMT and should not be manually modified. ## 1.0.43 -Wed, 25 Mar 2026 09:15:13 GMT -======= -This log was last generated on Tue, 24 Mar 2026 13:05:47 GMT and should not be manually modified. - -## 1.0.43 -Tue, 24 Mar 2026 13:05:47 GMT ->>>>>>> main +Thu, 02 Apr 2026 03:43:37 GMT _Version update only_ diff --git a/packages/react-vrender/CHANGELOG.json b/packages/react-vrender/CHANGELOG.json index c0aaa0add..f2a1866df 100644 --- a/packages/react-vrender/CHANGELOG.json +++ b/packages/react-vrender/CHANGELOG.json @@ -4,11 +4,7 @@ { "version": "1.0.43", "tag": "@visactor/react-vrender_v1.0.43", -<<<<<<< release/1.0.44 - "date": "Wed, 25 Mar 2026 09:15:13 GMT", -======= - "date": "Tue, 24 Mar 2026 13:05:47 GMT", ->>>>>>> main + "date": "Thu, 02 Apr 2026 03:43:37 GMT", "comments": {} }, { diff --git a/packages/react-vrender/CHANGELOG.md b/packages/react-vrender/CHANGELOG.md index fea268f06..9e2248510 100644 --- a/packages/react-vrender/CHANGELOG.md +++ b/packages/react-vrender/CHANGELOG.md @@ -1,16 +1,9 @@ # Change Log - @visactor/react-vrender -<<<<<<< release/1.0.44 -This log was last generated on Wed, 25 Mar 2026 09:15:13 GMT and should not be manually modified. +This log was last generated on Thu, 02 Apr 2026 03:43:37 GMT and should not be manually modified. ## 1.0.43 -Wed, 25 Mar 2026 09:15:13 GMT -======= -This log was last generated on Tue, 24 Mar 2026 13:05:47 GMT and should not be manually modified. - -## 1.0.43 -Tue, 24 Mar 2026 13:05:47 GMT ->>>>>>> main +Thu, 02 Apr 2026 03:43:37 GMT _Version update only_ diff --git a/packages/vrender-animate/CHANGELOG.json b/packages/vrender-animate/CHANGELOG.json index e81192216..31f889fa1 100644 --- a/packages/vrender-animate/CHANGELOG.json +++ b/packages/vrender-animate/CHANGELOG.json @@ -4,11 +4,7 @@ { "version": "1.0.43", "tag": "@visactor/vrender-animate_v1.0.43", -<<<<<<< release/1.0.44 - "date": "Wed, 25 Mar 2026 09:15:13 GMT", -======= - "date": "Tue, 24 Mar 2026 13:05:47 GMT", ->>>>>>> main + "date": "Thu, 02 Apr 2026 03:43:37 GMT", "comments": {} }, { diff --git a/packages/vrender-animate/CHANGELOG.md b/packages/vrender-animate/CHANGELOG.md index 11ebfce2a..6d4a0b993 100644 --- a/packages/vrender-animate/CHANGELOG.md +++ b/packages/vrender-animate/CHANGELOG.md @@ -1,16 +1,9 @@ # Change Log - @visactor/vrender-animate -<<<<<<< release/1.0.44 -This log was last generated on Wed, 25 Mar 2026 09:15:13 GMT and should not be manually modified. +This log was last generated on Thu, 02 Apr 2026 03:43:37 GMT and should not be manually modified. ## 1.0.43 -Wed, 25 Mar 2026 09:15:13 GMT -======= -This log was last generated on Tue, 24 Mar 2026 13:05:47 GMT and should not be manually modified. - -## 1.0.43 -Tue, 24 Mar 2026 13:05:47 GMT ->>>>>>> main +Thu, 02 Apr 2026 03:43:37 GMT _Version update only_ diff --git a/packages/vrender-animate/src/executor/utils.ts b/packages/vrender-animate/src/executor/utils.ts index 4edf6e3be..f0d4d5c53 100644 --- a/packages/vrender-animate/src/executor/utils.ts +++ b/packages/vrender-animate/src/executor/utils.ts @@ -18,13 +18,19 @@ export function getCustomType(custom: any): number { if (!custom.prototype) { return 2; } - // 检查构造函数是否是它自己(ES5类) + // 检查构造函数是否是它自己 if (custom.prototype.constructor === custom) { - // 检查prototype是否可写,类的prototype是不可写的 + // 检查prototype是否可写,原生class的prototype是不可写的 const descriptor = Object.getOwnPropertyDescriptor(custom, 'prototype'); if (descriptor && !descriptor.writable) { return 1; } + // Babel/TypeScript 转译后的类,prototype 可写但仍有方法在 prototype 上 + // 通过检查 prototype 上是否有除 constructor 之外的自有属性来判断 + const protoKeys = Object.getOwnPropertyNames(custom.prototype); + if (protoKeys.length > 1) { + return 1; + } } return 2; } diff --git a/packages/vrender-components/CHANGELOG.json b/packages/vrender-components/CHANGELOG.json index c6e7e249e..116b687b2 100644 --- a/packages/vrender-components/CHANGELOG.json +++ b/packages/vrender-components/CHANGELOG.json @@ -4,11 +4,7 @@ { "version": "1.0.43", "tag": "@visactor/vrender-components_v1.0.43", -<<<<<<< release/1.0.44 - "date": "Wed, 25 Mar 2026 09:15:13 GMT", -======= - "date": "Tue, 24 Mar 2026 13:05:47 GMT", ->>>>>>> main + "date": "Thu, 02 Apr 2026 03:43:37 GMT", "comments": { "none": [ { diff --git a/packages/vrender-components/CHANGELOG.md b/packages/vrender-components/CHANGELOG.md index 3b2dcf9aa..6d87ddc2e 100644 --- a/packages/vrender-components/CHANGELOG.md +++ b/packages/vrender-components/CHANGELOG.md @@ -1,16 +1,9 @@ # Change Log - @visactor/vrender-components -<<<<<<< release/1.0.44 -This log was last generated on Wed, 25 Mar 2026 09:15:13 GMT and should not be manually modified. +This log was last generated on Thu, 02 Apr 2026 03:43:37 GMT and should not be manually modified. ## 1.0.43 -Wed, 25 Mar 2026 09:15:13 GMT -======= -This log was last generated on Tue, 24 Mar 2026 13:05:47 GMT and should not be manually modified. - -## 1.0.43 -Tue, 24 Mar 2026 13:05:47 GMT ->>>>>>> main +Thu, 02 Apr 2026 03:43:37 GMT ### Updates diff --git a/packages/vrender-components/__tests__/unit/axis/line.test.ts b/packages/vrender-components/__tests__/unit/axis/line.test.ts index 11e61dc75..2743171a8 100644 --- a/packages/vrender-components/__tests__/unit/axis/line.test.ts +++ b/packages/vrender-components/__tests__/unit/axis/line.test.ts @@ -111,12 +111,14 @@ describe('Line Axis', () => { const axisLabels = axis.getElementsByName(`${AXIS_ELEMENT_NAME.labelContainer}-layer-0`)[0] as unknown as Group; expect(axisLabels.childrenCount).toBe(8); - expect((axisLabels.children[0] as unknown as Text).attribute.x).toBe(100); - expect((axisLabels.children[0] as unknown as Text).attribute.y).toBe(124); - expect((axisLabels.children[0] as unknown as Text).attribute.textAlign).toBe('center'); - expect((axisLabels.children[0] as unknown as Text).attribute.textBaseline).toBe('top'); - expect((axisLabels.children[0] as unknown as Text).attribute.text).toBe('A---'); - expect((axisLabels.children[0] as unknown as Text).AABBBounds.width()).toBeCloseTo(29.663970947265625); + const firstLabel = axisLabels.children[0] as unknown as Text; + const secondLabel = axisLabels.children[1] as unknown as Text; + expect(firstLabel.attribute.x).toBe(100); + expect(firstLabel.attribute.y).toBe(124); + expect(firstLabel.attribute.textAlign).toBe('center'); + expect(firstLabel.attribute.textBaseline).toBe('top'); + expect(firstLabel.attribute.text).toBe('A---'); + expect(firstLabel.AABBBounds.width()).toBeGreaterThan(secondLabel.AABBBounds.width()); }); it('vertical direction.', () => { @@ -186,12 +188,14 @@ describe('Line Axis', () => { const axisLabels = axis.getElementsByName(`${AXIS_ELEMENT_NAME.labelContainer}-layer-0`)[0] as unknown as Group; expect(axisLabels.childrenCount).toBe(8); - expect((axisLabels.children[0] as unknown as Text).attribute.x).toBe(76); - expect((axisLabels.children[0] as unknown as Text).attribute.y).toBe(200); - expect((axisLabels.children[0] as unknown as Text).attribute.text).toBe('A---'); - expect((axisLabels.children[0] as unknown as Text).attribute.textAlign).toBe('end'); - expect((axisLabels.children[0] as unknown as Text).attribute.textBaseline).toBe('middle'); - expect((axisLabels.children[0] as unknown as Text).AABBBounds.width()).toBeCloseTo(29.663970947265625); + const firstLabel = axisLabels.children[0] as unknown as Text; + const secondLabel = axisLabels.children[1] as unknown as Text; + expect(firstLabel.attribute.x).toBe(76); + expect(firstLabel.attribute.y).toBe(200); + expect(firstLabel.attribute.text).toBe('A---'); + expect(firstLabel.attribute.textAlign).toBe('end'); + expect(firstLabel.attribute.textBaseline).toBe('middle'); + expect(firstLabel.AABBBounds.width()).toBeGreaterThan(secondLabel.AABBBounds.width()); }); it('Line Axis with Title', () => { @@ -221,23 +225,33 @@ describe('Line Axis', () => { let axisTitle = axis.getElementsByName(AXIS_ELEMENT_NAME.title)[0] as unknown as Tag; expect(axisTitle).toBeInstanceOf(Tag); - expect(axisTitle.attribute.x).toBeCloseTo(230.01857069132552); - expect(axisTitle.attribute.y).toBeCloseTo(398.9777151704094); expect(axisTitle.attribute.angle).toBeCloseTo(0.6947382761967031); + const middleTitle = { + x: axisTitle.attribute.x as number, + y: axisTitle.attribute.y as number + }; // 将 title 位置更新至 start axis.setAttribute('title', { position: 'start' }); axisTitle = axis.getElementsByName(AXIS_ELEMENT_NAME.title)[0] as unknown as Tag; - expect(axisTitle.attribute.x).toBeCloseTo(80.01857069132552); - expect(axisTitle.attribute.y).toBeCloseTo(273.9777151704094); expect(axisTitle.attribute.angle).toBeCloseTo(0.6947382761967031); + const startTitle = { + x: axisTitle.attribute.x as number, + y: axisTitle.attribute.y as number + }; // 将 title 位置更新至 end axis.setAttribute('title', { position: 'end' }); axisTitle = axis.getElementsByName(AXIS_ELEMENT_NAME.title)[0] as unknown as Tag; - expect(axisTitle.attribute.x).toBeCloseTo(380.0185706913255); - expect(axisTitle.attribute.y).toBeCloseTo(523.9777151704094); expect(axisTitle.attribute.angle).toBeCloseTo(0.6947382761967031); + const endTitle = { + x: axisTitle.attribute.x as number, + y: axisTitle.attribute.y as number + }; + expect(endTitle.x - startTitle.x).toBeCloseTo(300); + expect(endTitle.y - startTitle.y).toBeCloseTo(250); + expect(middleTitle.x).toBeCloseTo((startTitle.x + endTitle.x) / 2); + expect(middleTitle.y).toBeCloseTo((startTitle.y + endTitle.y) / 2); // title 不跟随旋转 axis.setAttribute('title', { autoRotate: false }); @@ -256,8 +270,8 @@ describe('Line Axis', () => { text: '我是一个坐标轴标题' }); axisTitle = axis.getElementsByName(AXIS_ELEMENT_NAME.title)[0] as unknown as Tag; - expect(axisTitle.attribute.x).toBeCloseTo(380.0185706913255); - expect(axisTitle.attribute.y).toBeCloseTo(523.9777151704094); + expect(axisTitle.attribute.x).toBeCloseTo(endTitle.x); + expect(axisTitle.attribute.y).toBeCloseTo(endTitle.y); expect(axisTitle.attribute.angle).toBeCloseTo(0.6947382761967031); expect(axisTitle.getElementsByName('tag-panel')).toBeDefined(); @@ -931,9 +945,9 @@ describe('Line Axis', () => { (axis.getElementsByName('axis-label')[0] as IText).attribute.dx - (axis.getElementsByName('axis-label')[0] as IText).AABBBounds.width() ).toBeCloseTo((axis.getElementsByName('axis-label-container-layer-0')[0] as IGroup).AABBBounds.x1); - expect((axis.getElementsByName('axis-label-container-layer-0')[0] as IGroup).AABBBounds.width()).toBeCloseTo( - 11.16 - ); + expect( + (axis.getElementsByName('axis-label-container-layer-0')[0] as IGroup).AABBBounds.width() + ).toBeGreaterThanOrEqual((axis.getElementsByName('axis-label')[0] as IText).AABBBounds.width()); }); it("should work in `orient: 'right'` axis", () => { diff --git a/packages/vrender-components/__tests__/unit/axis/overlap/auto-limit.test.ts b/packages/vrender-components/__tests__/unit/axis/overlap/auto-limit.test.ts index 194538286..39b50fc25 100644 --- a/packages/vrender-components/__tests__/unit/axis/overlap/auto-limit.test.ts +++ b/packages/vrender-components/__tests__/unit/axis/overlap/auto-limit.test.ts @@ -144,10 +144,15 @@ describe('Auto Limit', () => { }); stage.defaultLayer.add(axis as unknown as IGraphic); stage.render(); - expect((axis.getElementsByName('axis-label')[0] as IText).clipedText).toBe('form等'); + const firstLabel = axis.getElementsByName('axis-label')[0] as IText; + const firstClippedText = firstLabel.clipedText as string; + expect(firstClippedText).not.toBe(firstLabel.attribute.text); + expect(firstClippedText.endsWith('等')).toBe(true); axis.setAttribute('verticalLimitSize', 60); - expect((axis.getElementsByName('axis-label')[0] as IText).clipedText).toBe('for等'); + const updatedClippedText = (axis.getElementsByName('axis-label')[0] as IText).clipedText as string; + expect(updatedClippedText.endsWith('等')).toBe(true); + expect(updatedClippedText.length).toBeLessThan(firstClippedText.length); }); it('should ignore when the ceil of label size is not bigger than limitSize', () => { @@ -290,7 +295,9 @@ describe('Auto Limit', () => { }); stage.defaultLayer.add(axis as unknown as IGraphic); stage.render(); - expect((axis.getElementsByName('axis-label')[4] as IText).clipedText).toBe('40-44'); - expect(Math.floor(axis.AABBBounds.width())).toBe(67); + const label = axis.getElementsByName('axis-label')[4] as IText; + expect(label.clipedText).toBe('40-44'); + expect(label.attribute.maxLineWidth).toBeUndefined(); + expect(Math.floor(label.AABBBounds.width())).toBeLessThanOrEqual(67); }); }); diff --git a/packages/vrender-components/__tests__/unit/bugfix/legend-focus-layout.test.ts b/packages/vrender-components/__tests__/unit/bugfix/legend-focus-layout.test.ts index cd95fe201..5b757b807 100644 --- a/packages/vrender-components/__tests__/unit/bugfix/legend-focus-layout.test.ts +++ b/packages/vrender-components/__tests__/unit/bugfix/legend-focus-layout.test.ts @@ -1,5 +1,6 @@ -import type { IGraphic, ISymbol, Stage } from '@visactor/vrender-core'; +import type { IGraphic, IGroup, ISymbol, IText, Stage } from '@visactor/vrender-core'; import { DiscreteLegend, LEGEND_ELEMENT_NAME } from '../../../src'; +import { DEFAULT_LABEL_SPACE, DEFAULT_SHAPE_SIZE, DEFAULT_SHAPE_SPACE } from '../../../src/legend/constant'; import { createCanvas } from '../../util/dom'; import { createStage } from '../../util/vrender'; import { initBrowserEnv } from '@visactor/vrender-kits'; @@ -16,6 +17,8 @@ describe('Legend focus layout', () => { stage.release(); }); + const getLegendItems = (legend: DiscreteLegend) => legend.getElementsByName(LEGEND_ELEMENT_NAME.item) as IGroup[]; + it('should not exceed the maximum width of the item, and the basic length exceeds, legend item with value', () => { const legend = new DiscreteLegend({ x: 100, @@ -45,7 +48,16 @@ describe('Legend focus layout', () => { stage.defaultLayer.add(legend as unknown as IGraphic); stage.render(); - expect(legend.AABBBounds.width()).toBe(422.05995178222656); + const legendItems = getLegendItems(legend); + const firstValue = legendItems[0].getElementsByName(LEGEND_ELEMENT_NAME.itemValue)[0] as IText; + expect(legendItems).toHaveLength(5); + legendItems.forEach(item => { + expect(item.AABBBounds.width()).toBeLessThanOrEqual(100.001); + }); + expect(legendItems[0].AABBBounds.width()).toBeGreaterThan(legendItems[1].AABBBounds.width()); + expect(firstValue.attribute.maxLineWidth).toBeCloseTo( + (100 - DEFAULT_SHAPE_SIZE - DEFAULT_SHAPE_SPACE - DEFAULT_LABEL_SPACE) / 2 + ); }); it('should not exceed the maximum width of the item, and the basic length exceeds, legend item without value', () => { @@ -71,7 +83,14 @@ describe('Legend focus layout', () => { stage.defaultLayer.add(legend as unknown as IGraphic); stage.render(); - expect(legend.AABBBounds.width()).toBe(310); + const legendItems = getLegendItems(legend); + const firstLabel = legendItems[0].getElementsByName(LEGEND_ELEMENT_NAME.itemLabel)[0] as IText; + expect(legendItems).toHaveLength(5); + legendItems.forEach(item => { + expect(item.AABBBounds.width()).toBeLessThanOrEqual(100.001); + }); + expect(legendItems[0].AABBBounds.width()).toBeGreaterThan(legendItems[1].AABBBounds.width()); + expect(firstLabel.attribute.maxLineWidth).toBeCloseTo(82); }); it('should not exceed the maximum width of the item, and the basic length exceeds, legend item with focus', () => { @@ -99,7 +118,11 @@ describe('Legend focus layout', () => { stage.defaultLayer.add(legend as unknown as IGraphic); stage.render(); - expect(legend.AABBBounds.width()).toBe(108.71428571428572); + const legendItems = getLegendItems(legend); + const firstLabel = legendItems[0].getElementsByName(LEGEND_ELEMENT_NAME.itemLabel)[0] as IText; + expect(legend.AABBBounds.width()).toBeLessThanOrEqual(110.001); + expect(legend.AABBBounds.width()).toBeGreaterThan(90); + expect(firstLabel.attribute.maxLineWidth).toBeCloseTo(72); }); it('should not exceed the maximum width of the item, and the basic length exceeds, legend item with focus and value', () => { @@ -133,7 +156,11 @@ describe('Legend focus layout', () => { stage.defaultLayer.add(legend as unknown as IGraphic); stage.render(); - expect(legend.AABBBounds.width()).toBe(99.92627607073103); + const legendItems = getLegendItems(legend); + const firstValue = legendItems[0].getElementsByName(LEGEND_ELEMENT_NAME.itemValue)[0] as IText; + expect(legend.AABBBounds.width()).toBeLessThanOrEqual(110.001); + expect(legend.AABBBounds.width()).toBeGreaterThan(90); + expect(firstValue.attribute.maxLineWidth).toBeCloseTo(28); }); it('should calculate when legend item just has label', () => { @@ -305,6 +332,9 @@ describe('Legend focus layout', () => { stage.defaultLayer.add(legend as unknown as IGraphic); stage.render(); expect(legend.getElementsByName(LEGEND_ELEMENT_NAME.focus).length).toBe(4); - expect((legend.getElementsByName(LEGEND_ELEMENT_NAME.focus)[0] as ISymbol).attribute.x).toBe(41); + const firstItem = getLegendItems(legend)[0]; + const firstLabel = firstItem.getElementsByName(LEGEND_ELEMENT_NAME.itemLabel)[0] as IText; + const firstFocus = firstItem.getElementsByName(LEGEND_ELEMENT_NAME.focus)[0] as ISymbol; + expect(firstFocus.attribute.x - firstLabel.attribute.x).toBeCloseTo(firstLabel.AABBBounds.width() + 6); }); }); diff --git a/packages/vrender-components/__tests__/unit/legend/discrete.test.ts b/packages/vrender-components/__tests__/unit/legend/discrete.test.ts index 42c876851..891d8fc62 100644 --- a/packages/vrender-components/__tests__/unit/legend/discrete.test.ts +++ b/packages/vrender-components/__tests__/unit/legend/discrete.test.ts @@ -227,7 +227,10 @@ describe('DiscreteLegend', () => { stage.defaultLayer.add(legend as unknown as IGraphic); stage.render(); - expect(legend.AABBBounds.width()).toBe(76); + const legendItems = legend.getElementsByName('legendItem') as IGroup[]; + expect(legendItems).toHaveLength(2); + expect(legend.AABBBounds.width()).toBeCloseTo(Math.max(...legendItems.map(item => item.AABBBounds.width()))); + expect(legend.AABBBounds.width()).toBeLessThan(1000); }); it("should omit when label's width exceeds item's width", () => { @@ -418,13 +421,16 @@ describe('DiscreteLegend', () => { stage.defaultLayer.add(legend as unknown as IGraphic); stage.render(); - expect((legend.getElementsByName('legendItem')[0] as IGroup).AABBBounds.width()).toBe(121.95); - expect( - (legend.getElementsByName('legendItem')[0].getElementsByName('legendItemLabel')[0] as IText)._AABBBounds.width() - ).toBeCloseTo(57.143951416015625); - expect( - (legend.getElementsByName('legendItem')[0].getElementsByName('legendItemValue')[0] as IText).attribute - .maxLineWidth - ).toBeCloseTo(49.975); + const legendItem = legend.getElementsByName('legendItem')[0] as IGroup; + const label = legendItem.getElementsByName('legendItemLabel')[0] as IText; + const value = legendItem.getElementsByName('legendItemValue')[0] as IText; + const labelMaxLineWidth = label.attribute.maxLineWidth as number; + const valueMaxLineWidth = value.attribute.maxLineWidth as number; + const layoutWidth = 121.95 - 2 - 2 - 10 - 4 - 4; + + expect(legendItem.AABBBounds.width()).toBe(121.95); + expect(valueMaxLineWidth).toBeCloseTo(layoutWidth / 2); + expect(labelMaxLineWidth).toBeCloseTo(Math.max(layoutWidth / 2, layoutWidth - value._AABBBounds.width())); + expect(label.AABBBounds.width()).toBeLessThanOrEqual(labelMaxLineWidth + 0.001); }); }); diff --git a/packages/vrender-components/__tests__/unit/pager.test.ts b/packages/vrender-components/__tests__/unit/pager.test.ts index 0bf4009bf..b5cf1f8ef 100644 --- a/packages/vrender-components/__tests__/unit/pager.test.ts +++ b/packages/vrender-components/__tests__/unit/pager.test.ts @@ -1,4 +1,5 @@ -import type { IGraphic, Stage, ISymbol } from '@visactor/vrender-core'; +import type { IGraphic, IText, Stage, ISymbol } from '@visactor/vrender-core'; +import { normalizePadding } from '@visactor/vutils'; import { Pager } from '../../src'; import { createCanvas } from '../util/dom'; import { createStage } from '../util/vrender'; @@ -38,8 +39,30 @@ describe('Pager', () => { expect((pager.preHandler as ISymbol).hasState('disable')).toBeTruthy(); expect((pager.nextHandler as ISymbol).hasState('disable')).toBeFalsy(); - expect(pager.AABBBounds.width()).toBeCloseTo(86.39999389648438); - expect(pager.AABBBounds.height()).toBeCloseTo(35); + expect((pager.text as IText).attribute.text).toBe('1/9'); + const minX = Math.min( + (pager.preHandler as ISymbol).AABBBounds.x1, + (pager.text as IText).AABBBounds.x1, + (pager.nextHandler as ISymbol).AABBBounds.x1 + ); + const maxX = Math.max( + (pager.preHandler as ISymbol).AABBBounds.x2, + (pager.text as IText).AABBBounds.x2, + (pager.nextHandler as ISymbol).AABBBounds.x2 + ); + const minY = Math.min( + (pager.preHandler as ISymbol).AABBBounds.y1, + (pager.text as IText).AABBBounds.y1, + (pager.nextHandler as ISymbol).AABBBounds.y1 + ); + const maxY = Math.max( + (pager.preHandler as ISymbol).AABBBounds.y2, + (pager.text as IText).AABBBounds.y2, + (pager.nextHandler as ISymbol).AABBBounds.y2 + ); + const parsedPadding = normalizePadding(pager.attribute.padding ?? 0); + expect(pager.AABBBounds.width()).toBeCloseTo(maxX - minX + parsedPadding[1] + parsedPadding[3]); + expect(pager.AABBBounds.height()).toBeCloseTo(maxY - minY + parsedPadding[0] + parsedPadding[2]); }); it('Pager in vertical should be render correctly', () => { @@ -57,7 +80,29 @@ describe('Pager', () => { expect((pager.preHandler as ISymbol).hasState('disable')).toBeFalsy(); expect((pager.nextHandler as ISymbol).hasState('disable')).toBeFalsy(); - expect(pager.AABBBounds.width()).toBeCloseTo(20.399993896484375); - expect(pager.AABBBounds.height()).toBeCloseTo(58); + expect((pager.text as IText).attribute.text).toBe('3/9'); + const minX = Math.min( + (pager.preHandler as ISymbol).AABBBounds.x1, + (pager.text as IText).AABBBounds.x1, + (pager.nextHandler as ISymbol).AABBBounds.x1 + ); + const maxX = Math.max( + (pager.preHandler as ISymbol).AABBBounds.x2, + (pager.text as IText).AABBBounds.x2, + (pager.nextHandler as ISymbol).AABBBounds.x2 + ); + const minY = Math.min( + (pager.preHandler as ISymbol).AABBBounds.y1, + (pager.text as IText).AABBBounds.y1, + (pager.nextHandler as ISymbol).AABBBounds.y1 + ); + const maxY = Math.max( + (pager.preHandler as ISymbol).AABBBounds.y2, + (pager.text as IText).AABBBounds.y2, + (pager.nextHandler as ISymbol).AABBBounds.y2 + ); + const parsedPadding = normalizePadding(pager.attribute.padding ?? 0); + expect(pager.AABBBounds.width()).toBeCloseTo(maxX - minX + parsedPadding[1] + parsedPadding[3]); + expect(pager.AABBBounds.height()).toBeCloseTo(maxY - minY + parsedPadding[0] + parsedPadding[2]); }); }); diff --git a/packages/vrender-components/__tests__/unit/slider.test.ts b/packages/vrender-components/__tests__/unit/slider.test.ts index 9e5c2d002..ead4ee7d9 100644 --- a/packages/vrender-components/__tests__/unit/slider.test.ts +++ b/packages/vrender-components/__tests__/unit/slider.test.ts @@ -67,7 +67,7 @@ describe('Slider', () => { const endText = slider.getElementsByName(SLIDER_ELEMENT_NAME.endText)[0] as IText; expect(endText.attribute.y).toBe(5); - expect(endText.attribute.x).toBeCloseTo(239.1479949951172); + expect(endText.attribute.x).toBeCloseTo(startText.AABBBounds.width() + 216); expect(endText.attribute.textAlign).toBe('start'); expect(endText.attribute.textBaseline).toBe('middle'); @@ -132,7 +132,7 @@ describe('Slider', () => { expect(startText.attribute.textBaseline).toBe('top'); const endText = slider.getElementsByName(SLIDER_ELEMENT_NAME.endText)[0] as IText; - expect(endText.attribute.y).toBe(228); + expect(endText.attribute.y).toBeCloseTo(startText.AABBBounds.height() + 216); expect(endText.attribute.x).toBeCloseTo(5); expect(endText.attribute.textAlign).toBe('center'); expect(endText.attribute.textBaseline).toBe('top'); diff --git a/packages/vrender-components/jest.config.js b/packages/vrender-components/jest.config.js index 316f8523f..cf5bebffb 100644 --- a/packages/vrender-components/jest.config.js +++ b/packages/vrender-components/jest.config.js @@ -2,10 +2,13 @@ const path = require('path'); module.exports = { preset: 'ts-jest', - runner: 'jest-electron/runner', - testEnvironment: 'jest-electron/environment', + testEnvironment: path.resolve(__dirname, '../../share/jest-config/jest-environment-jsdom-26.js'), + testEnvironmentOptions: { + pretendToBeVisual: true + }, testRegex: '/__tests__/.*\\.test\\.(js|ts)$', silent: true, + useStderr: false, globals: { 'ts-jest': { resolveJsonModule: true, @@ -19,7 +22,7 @@ module.exports = { collectCoverage: false, collectCoverageFrom: ['src/**/*.ts', '!**/type/**'], coverageReporters: ['json-summary', 'lcov', 'text'], - setupFiles: ['./setup-mock.js'], + setupFiles: [path.resolve(__dirname, '../../share/jest-config/setup-jsdom-canvas.js'), './setup-mock.js'], coveragePathIgnorePatterns: ['node_modules', '__tests__', 'interface.ts', '.d.ts', 'typings', 'type.ts'], moduleNameMapper: { '@visactor/vrender-kits': path.resolve(__dirname, '../vrender-kits/src/index.ts'), diff --git a/packages/vrender-components/package.json b/packages/vrender-components/package.json index a90919e83..dae898378 100644 --- a/packages/vrender-components/package.json +++ b/packages/vrender-components/package.json @@ -17,7 +17,7 @@ "build": "cross-env DEBUG='Bundler*' bundle", "dev": "cross-env DEBUG='Bundler*' bundle --clean -f es -w", "start": "vite ./__tests__/browser", - "test": "jest", + "test": "jest 2>&1", "test-cov": "jest --coverage", "test-live": "npm run test-watch __tests__/unit/", "test-watch": "cross-env DEBUG_MODE=1 jest --watch", diff --git a/packages/vrender-components/tsconfig.test.json b/packages/vrender-components/tsconfig.test.json index 473e2e391..d5fd20f27 100644 --- a/packages/vrender-components/tsconfig.test.json +++ b/packages/vrender-components/tsconfig.test.json @@ -1,6 +1,7 @@ { "extends": "./tsconfig.json", "compilerOptions": { + "sourceMap": true, "paths": { "@visactor/vrender": ["../vrender/src"], "@visactor/vrender-core": ["../vrender-core/src"], diff --git a/packages/vrender-core/CHANGELOG.json b/packages/vrender-core/CHANGELOG.json index e0fe44130..44270a9bb 100644 --- a/packages/vrender-core/CHANGELOG.json +++ b/packages/vrender-core/CHANGELOG.json @@ -4,8 +4,14 @@ { "version": "1.0.43", "tag": "@visactor/vrender-core_v1.0.43", - "date": "Tue, 24 Mar 2026 13:05:47 GMT", - "comments": {} + "date": "Thu, 02 Apr 2026 03:43:37 GMT", + "comments": { + "none": [ + { + "comment": "feat: enhance background handling in rendering\n\n" + } + ] + } }, { "version": "1.0.42", diff --git a/packages/vrender-core/CHANGELOG.md b/packages/vrender-core/CHANGELOG.md index 94a9b5ed3..7558dd58d 100644 --- a/packages/vrender-core/CHANGELOG.md +++ b/packages/vrender-core/CHANGELOG.md @@ -1,18 +1,15 @@ # Change Log - @visactor/vrender-core -<<<<<<< release/1.0.44 -This log was last generated on Wed, 25 Mar 2026 09:15:13 GMT and should not be manually modified. +This log was last generated on Thu, 02 Apr 2026 03:43:37 GMT and should not be manually modified. ## 1.0.43 -Wed, 25 Mar 2026 09:15:13 GMT -======= -This log was last generated on Tue, 24 Mar 2026 13:05:47 GMT and should not be manually modified. +Thu, 02 Apr 2026 03:43:37 GMT + +### Updates + +- feat: enhance background handling in rendering -## 1.0.43 -Tue, 24 Mar 2026 13:05:47 GMT ->>>>>>> main -_Version update only_ ## 1.0.42 Mon, 23 Mar 2026 08:08:45 GMT diff --git a/packages/vrender-core/__tests__/background/background-image-layout.test.ts b/packages/vrender-core/__tests__/background/background-image-layout.test.ts new file mode 100644 index 000000000..5ed584b2f --- /dev/null +++ b/packages/vrender-core/__tests__/background/background-image-layout.test.ts @@ -0,0 +1,375 @@ +import { DefaultAttribute } from '../../src/graphic/config'; +import { + DefaultBaseBackgroundRenderContribution, + drawBackgroundImage, + resolveBackgroundDrawMode +} from '../../src/render/contributions/render/contributions/base-contribution-render'; +import { DefaultGroupBackgroundRenderContribution } from '../../src/render/contributions/render/contributions/group-contribution-render'; +import { DefaultTextBackgroundRenderContribution } from '../../src/render/contributions/render/contributions/text-contribution-render'; +import { DefaultDrawContribution } from '../../src/render/contributions/render/draw-contribution'; + +function createBounds(x: number, y: number, width: number, height: number) { + return { + x1: x, + y1: y, + x2: x + width, + y2: y + height, + width: () => width, + height: () => height + }; +} + +function createImage(width: number, height: number) { + return { width, height }; +} + +function createContext() { + return { + dpr: 1, + globalAlpha: 1, + drawImage: jest.fn(), + createPattern: jest.fn(), + translate: jest.fn(), + fillRect: jest.fn(), + clearRect: jest.fn(), + save: jest.fn(), + restore: jest.fn(), + clip: jest.fn(), + rect: jest.fn(), + beginPath: jest.fn(), + highPerformanceSave: jest.fn(), + highPerformanceRestore: jest.fn(), + setCommonStyle: jest.fn(), + setTransformFromMatrix: jest.fn(), + setTransformForCurrent: jest.fn(), + currentMatrix: { clone: () => ({}) } + }; +} + +class TestBaseBackgroundRenderContribution extends DefaultBaseBackgroundRenderContribution { + capturedParams: any; + capturedBounds: any; + + protected doDrawImage(context: any, data: any, b: any, params: any): void { + this.capturedBounds = b; + this.capturedParams = params; + } +} + +class TestGroupBackgroundRenderContribution extends DefaultGroupBackgroundRenderContribution { + capturedParams: any; + + protected doDrawImage(context: any, data: any, b: any, params: any): void { + this.capturedParams = params; + } +} + +class TestTextBackgroundRenderContribution extends DefaultTextBackgroundRenderContribution { + capturedParams: any; + capturedBounds: any; + + protected doDrawImage(context: any, data: any, b: any, params: any): void { + this.capturedBounds = b; + this.capturedParams = params; + } +} + +class TestDrawContribution extends DefaultDrawContribution { + constructor() { + super([], { getContributions: (): any[] => [] } as any); + } + + clear(renderService: any, context: any, drawContext: any) { + this.clearScreen(renderService, context, drawContext); + } +} + +describe('background image layout', () => { + test('supports cover layout with centered crop', () => { + const context = createContext(); + + drawBackgroundImage(context as any, createImage(200, 100), createBounds(0, 0, 100, 100) as any, { + backgroundMode: 'no-repeat', + backgroundFit: true, + backgroundKeepAspectRatio: true, + backgroundPosition: 'center' + }); + + expect(context.drawImage).toHaveBeenCalledWith(expect.anything(), -50, 0, 200, 100); + }); + + test('supports contain layout with anchor positioning', () => { + const context = createContext(); + + drawBackgroundImage(context as any, createImage(200, 100), createBounds(0, 0, 100, 100) as any, { + backgroundMode: 'no-repeat-contain', + backgroundFit: true, + backgroundKeepAspectRatio: true, + backgroundPosition: 'bottom-right' + }); + + expect(context.drawImage).toHaveBeenCalledWith(expect.anything(), 0, 50, 100, 50); + }); + + test('resolves legacy no-repeat config and sizing shorthands correctly', () => { + // Legacy: backgroundFit + backgroundKeepAspectRatio + expect( + resolveBackgroundDrawMode({ + backgroundMode: 'no-repeat', + backgroundFit: true, + backgroundKeepAspectRatio: true + }) + ).toEqual({ + backgroundRepeatMode: 'no-repeat', + backgroundSizing: 'cover' + }); + + expect( + resolveBackgroundDrawMode({ + backgroundMode: 'no-repeat', + backgroundFit: true, + backgroundKeepAspectRatio: false + }) + ).toEqual({ + backgroundRepeatMode: 'no-repeat', + backgroundSizing: 'fill' + }); + + expect( + resolveBackgroundDrawMode({ + backgroundMode: 'no-repeat', + backgroundFit: false, + backgroundKeepAspectRatio: true + }) + ).toEqual({ + backgroundRepeatMode: 'no-repeat', + backgroundSizing: 'auto' + }); + + // Shorthands: override backgroundFit/backgroundKeepAspectRatio + expect( + resolveBackgroundDrawMode({ + backgroundMode: 'no-repeat-contain', + backgroundFit: true, + backgroundKeepAspectRatio: false + }) + ).toEqual({ + backgroundRepeatMode: 'no-repeat', + backgroundSizing: 'contain' + }); + + expect( + resolveBackgroundDrawMode({ + backgroundMode: 'no-repeat-cover', + backgroundFit: false, + backgroundKeepAspectRatio: false + }) + ).toEqual({ + backgroundRepeatMode: 'no-repeat', + backgroundSizing: 'cover' + }); + + expect( + resolveBackgroundDrawMode({ + backgroundMode: 'no-repeat-fill', + backgroundFit: false, + backgroundKeepAspectRatio: true + }) + ).toEqual({ + backgroundRepeatMode: 'no-repeat', + backgroundSizing: 'fill' + }); + + expect( + resolveBackgroundDrawMode({ + backgroundMode: 'no-repeat-auto', + backgroundFit: true, + backgroundKeepAspectRatio: true + }) + ).toEqual({ + backgroundRepeatMode: 'no-repeat', + backgroundSizing: 'auto' + }); + }); + + test('supports fill layout with scaling and centered alignment', () => { + const context = createContext(); + + drawBackgroundImage(context as any, createImage(20, 10), createBounds(0, 0, 100, 100) as any, { + backgroundMode: 'no-repeat', + backgroundFit: true, + backgroundKeepAspectRatio: false, + backgroundScale: 0.5, + backgroundPosition: 'center' + }); + + expect(context.drawImage).toHaveBeenCalledWith(expect.anything(), 25, 25, 50, 50); + }); + + test('supports auto layout with percentage positioning', () => { + const context = createContext(); + + drawBackgroundImage(context as any, createImage(20, 10), createBounds(0, 0, 100, 100) as any, { + backgroundMode: 'no-repeat', + backgroundFit: false, + backgroundKeepAspectRatio: true, + backgroundPosition: ['50%', '100%'] + }); + + expect(context.drawImage).toHaveBeenCalledWith(expect.anything(), 40, 90, 20, 10); + }); + + test('base contribution resolves wrapped background images by inner resource key', () => { + const contribution = new TestBaseBackgroundRenderContribution(); + const context = createContext(); + + contribution.drawShape( + { + attribute: { + background: { background: 'image-key' }, + backgroundMode: 'no-repeat-contain', + backgroundPosition: 'center', + backgroundClip: true + }, + backgroundImg: true, + resources: new Map([['image-key', { state: 'success', data: createImage(10, 10) }]]), + transMatrix: { onlyTranslate: () => true }, + AABBBounds: createBounds(0, 0, 100, 100) + } as any, + context as any, + 0, + 0, + false, + false, + false, + false, + DefaultAttribute as any, + {} as any + ); + + expect(contribution.capturedParams.backgroundMode).toBe('no-repeat-contain'); + expect(contribution.capturedParams.backgroundPosition).toBe('center'); + expect(context.clip).toHaveBeenCalled(); + }); + + test('group contribution forwards sizing and position to shared renderer', () => { + const contribution = new TestGroupBackgroundRenderContribution(); + const context = createContext(); + + contribution.drawShape( + { + attribute: { + background: 'image-key', + backgroundMode: 'no-repeat-contain', + backgroundPosition: 'bottom-right', + backgroundClip: true + }, + backgroundImg: true, + resources: new Map([['image-key', { state: 'success', data: createImage(10, 10) }]]), + parent: { globalTransMatrix: {} }, + transMatrix: { onlyTranslate: () => true }, + AABBBounds: createBounds(0, 0, 100, 100) + } as any, + context as any, + 0, + 0, + false, + false, + false, + false, + DefaultAttribute as any, + {} as any + ); + + expect(contribution.capturedParams.backgroundMode).toBe('no-repeat-contain'); + expect(contribution.capturedParams.backgroundPosition).toBe('bottom-right'); + expect(context.clip).toHaveBeenCalled(); + }); + + test('text contribution respects wrapped background bounds and passes layout options', () => { + const contribution = new TestTextBackgroundRenderContribution(); + const context = createContext(); + + contribution.drawShape( + { + type: 'text', + attribute: { + background: { + background: 'image-key', + x: 10, + y: 20, + width: 30, + height: 40, + dx: 5, + dy: 6 + }, + backgroundMode: 'no-repeat', + backgroundFit: false, + backgroundPosition: 'bottom-right', + backgroundClip: true, + backgroundCornerRadius: 0 + }, + backgroundImg: true, + resources: new Map([['image-key', { state: 'success', data: createImage(10, 10) }]]), + parent: { globalTransMatrix: {} }, + transMatrix: { onlyTranslate: () => true }, + AABBBounds: createBounds(0, 0, 100, 100) + } as any, + context as any, + 0, + 0, + false, + false, + false, + false, + DefaultAttribute as any, + {} as any + ); + + expect(contribution.capturedBounds.x1).toBe(15); + expect(contribution.capturedBounds.y1).toBe(26); + expect(contribution.capturedBounds.width()).toBe(30); + expect(contribution.capturedBounds.height()).toBe(40); + expect(contribution.capturedParams.backgroundMode).toBe('no-repeat'); + expect(contribution.capturedParams.backgroundFit).toBe(false); + expect(contribution.capturedParams.backgroundPosition).toBe('bottom-right'); + expect(context.clip).toHaveBeenCalled(); + }); + + test('stage clear screen uses shared background layout options', () => { + const drawContribution = new TestDrawContribution(); + const context = createContext(); + const stage = { + backgroundImg: true, + resources: new Map([['image-key', { state: 'success', data: createImage(200, 100) }]]), + attribute: { + opacity: 0.5, + backgroundOpacity: 0.2, + backgroundMode: 'no-repeat', + backgroundFit: true, + backgroundKeepAspectRatio: true, + backgroundPosition: 'center', + backgroundScale: 1, + backgroundOffsetX: 0, + backgroundOffsetY: 0 + }, + hooks: { + afterClearRect: { + call: jest.fn() + } + } + }; + + drawContribution.clear( + { drawParams: { stage } } as any, + context as any, + { + clear: { background: 'image-key' }, + viewBox: createBounds(0, 0, 100, 100) + } as any + ); + + expect(context.drawImage).toHaveBeenCalledWith(expect.anything(), -50, 0, 200, 100); + expect(context.globalAlpha).toBe(0.1); + }); +}); diff --git a/packages/vrender-core/__tests__/image/image-layout.test.ts b/packages/vrender-core/__tests__/image/image-layout.test.ts new file mode 100644 index 000000000..261c1094b --- /dev/null +++ b/packages/vrender-core/__tests__/image/image-layout.test.ts @@ -0,0 +1,215 @@ +import { Image } from '../../src/graphic/image'; +import { + DefaultCanvasImageRender, + drawImageWithLayout, + resolveImageMode, + shouldClipImageByLayout +} from '../../src/render/contributions/render/image-render'; +import { drawBackgroundImage } from '../../src/render/contributions/render/contributions/base-contribution-render'; + +function createImageData(width: number, height: number) { + return { width, height }; +} + +function createContext() { + return { + dpr: 1, + globalAlpha: 1, + fillStyle: '', + beginPath: jest.fn(), + rect: jest.fn(), + save: jest.fn(), + restore: jest.fn(), + clip: jest.fn(), + stroke: jest.fn(), + drawImage: jest.fn(), + createPattern: jest.fn(), + translate: jest.fn(), + fillRect: jest.fn(), + setCommonStyle: jest.fn(), + setShadowBlendStyle: jest.fn(), + setStrokeStyle: jest.fn() + }; +} + +function prepareRenderableImage(image: Image) { + image._actualWidth = image.attribute.width as number; + image._actualHeight = image.attribute.height as number; + (image as any).tryUpdateAABBBounds = jest.fn(); + return image; +} + +describe('image layout', () => { + test('supports cover layout with centered crop', () => { + const context = createContext(); + + drawImageWithLayout(context as any, createImageData(200, 100), 0, 0, 100, 100, { + imageMode: 'cover', + imagePosition: 'center' + }); + + expect(context.drawImage).toHaveBeenCalledWith(expect.anything(), -50, 0, 200, 100); + }); + + test('supports contain layout with centered blank space', () => { + const context = createContext(); + + drawImageWithLayout(context as any, createImageData(200, 100), 0, 0, 100, 100, { + imageMode: 'contain', + imagePosition: 'center' + }); + + expect(context.drawImage).toHaveBeenCalledWith(expect.anything(), 0, 25, 100, 50); + }); + + test('supports sizing shorthand through imageMode', () => { + const context = createContext(); + + drawImageWithLayout(context as any, createImageData(200, 100), 0, 0, 100, 100, { + imageMode: 'contain', + imagePosition: 'center' + }); + + expect(context.drawImage).toHaveBeenCalledWith(expect.anything(), 0, 25, 100, 50); + }); + + test('imageMode is ignored when repeat mode is enabled', () => { + expect( + resolveImageMode({ + repeatX: 'repeat', + repeatY: 'repeat', + imageMode: 'cover' + }) + ).toEqual({ + repeatMode: 'repeat', + sizingMode: 'fill' + }); + }); + + test('defaults to fill when imageMode is undefined', () => { + expect( + resolveImageMode({ + repeatX: 'no-repeat', + repeatY: 'no-repeat' + }) + ).toEqual({ + repeatMode: 'no-repeat', + sizingMode: 'fill' + }); + }); + + test('supports fill layout to match target size', () => { + const context = createContext(); + + drawImageWithLayout(context as any, createImageData(200, 100), 0, 0, 100, 100, { + imageMode: 'fill' + }); + + expect(context.drawImage).toHaveBeenCalledWith(expect.anything(), 0, 0, 100, 100); + }); + + test('uses intrinsic size when image element width and height are zero', () => { + const context = createContext(); + + drawBackgroundImage( + context as any, + { + width: 0, + height: 0, + naturalWidth: 200, + naturalHeight: 100 + }, + { + x1: 0, + y1: 0, + x2: 100, + y2: 100, + width: () => 100, + height: () => 100 + } as any, + { + backgroundMode: 'no-repeat', + backgroundFit: true, + backgroundKeepAspectRatio: false + } + ); + + expect(context.drawImage).toHaveBeenCalledWith(expect.anything(), 0, 0, 100, 100); + }); + + test('supports auto layout with original size and positioning', () => { + const context = createContext(); + + drawImageWithLayout(context as any, createImageData(20, 10), 0, 0, 100, 100, { + imageMode: 'auto', + imagePosition: 'center' + }); + + expect(context.drawImage).toHaveBeenCalledWith(expect.anything(), 40, 45, 20, 10); + }); + + test('clips when image content may overflow container', () => { + const render = new DefaultCanvasImageRender({ getContributions: (): any[] => [] } as any); + const context = createContext(); + const image = prepareRenderableImage( + new Image({ + width: 100, + height: 100, + image: createImageData(200, 100) as any, + imageMode: 'cover', + imagePosition: 'center' + }) + ); + + render.drawShape(image, context as any, 0, 0, {} as any); + + expect(context.clip).toHaveBeenCalledTimes(1); + expect(context.drawImage).toHaveBeenCalledWith(expect.anything(), -50, 0, 200, 100); + }); + + test('keeps default fill behavior without extra clip', () => { + const render = new DefaultCanvasImageRender({ getContributions: (): any[] => [] } as any); + const context = createContext(); + const image = prepareRenderableImage( + new Image({ + width: 100, + height: 100, + image: createImageData(200, 100) as any + }) + ); + + render.drawShape(image, context as any, 0, 0, {} as any); + + expect(shouldClipImageByLayout(image.attribute)).toBe(false); + expect(context.clip).not.toHaveBeenCalled(); + expect(context.drawImage).toHaveBeenCalledWith(expect.anything(), 0, 0, 100, 100); + }); + + test('does not clip for contain mode at default params', () => { + expect( + shouldClipImageByLayout({ + repeatX: 'no-repeat', + repeatY: 'no-repeat', + imageMode: 'contain', + imageScale: 1, + imageOffsetX: 0, + imageOffsetY: 0, + imagePosition: 'center' + }) + ).toBe(false); + }); + + test('clips for contain mode when scale or offset overflows', () => { + expect( + shouldClipImageByLayout({ + repeatX: 'no-repeat', + repeatY: 'no-repeat', + imageMode: 'contain', + imageScale: 2, + imageOffsetX: 0, + imageOffsetY: 0, + imagePosition: 'center' + }) + ).toBe(true); + }); +}); diff --git a/packages/vrender-core/jest.config.js b/packages/vrender-core/jest.config.js index 9aa12d71a..1a72a29b3 100644 --- a/packages/vrender-core/jest.config.js +++ b/packages/vrender-core/jest.config.js @@ -1,24 +1,28 @@ module.exports = { - runner: 'jest-electron/runner', - testEnvironment: 'jest-electron/environment', + testEnvironment: '../../share/jest-config/jest-environment-jsdom-26.js', + testEnvironmentOptions: { + pretendToBeVisual: true + }, testTimeout: 30000, testRegex: '/__tests__/.*test\\.ts?$', moduleFileExtensions: ['ts', 'js', 'json'], setupFilesAfterEnv: ['jest-extended/all'], preset: 'ts-jest', silent: true, + useStderr: false, globals: { 'ts-jest': { tsconfig: { resolveJsonModule: true, esModuleInterop: true, experimentalDecorators: true, - module: 'ESNext' + module: 'ESNext', + sourceMap: true } }, __DEV__: true }, - setupFiles: ['./setup-mock.js'], + setupFiles: ['../../share/jest-config/setup-jsdom-canvas.js', './setup-mock.js'], verbose: true, coverageReporters: ['json-summary', 'lcov', 'text'], coveragePathIgnorePatterns: ['node_modules', '__tests__', 'interface.ts', '.d.ts', 'typings'], diff --git a/packages/vrender-core/package.json b/packages/vrender-core/package.json index 906d6710d..dee8cc089 100644 --- a/packages/vrender-core/package.json +++ b/packages/vrender-core/package.json @@ -22,7 +22,7 @@ "build-umd": "cross-env DEBUG='Bundler*' bundle --clean -f umd", "dev": "cross-env DEBUG='Bundler*' bundle --clean -f es -w", "start": "vite ./__tests__/browser", - "test": "jest", + "test": "jest 2>&1", "test-live": "npm run test-watch __tests__/unit/theme/line.test.ts", "test-watch": "cross-env DEBUG_MODE=1 jest --watch", "test-cov": "jest -w 16 --coverage", diff --git a/packages/vrender-core/src/core/layer.ts b/packages/vrender-core/src/core/layer.ts index 39db24ea5..e43dde2e0 100644 --- a/packages/vrender-core/src/core/layer.ts +++ b/packages/vrender-core/src/core/layer.ts @@ -38,7 +38,7 @@ export class Layer extends Group implements ILayer { // 混合模式,用于多图层混合 declare blendMode: BlendMode; - declare background: string; + declare background: ILayer['background']; declare opacity: number; declare layer: this; diff --git a/packages/vrender-core/src/core/stage.ts b/packages/vrender-core/src/core/stage.ts index 396018041..49e76d61d 100644 --- a/packages/vrender-core/src/core/stage.ts +++ b/packages/vrender-core/src/core/stage.ts @@ -1,7 +1,8 @@ import type { IAABBBounds, IBounds, IBoundsLike, IMatrix } from '@visactor/vutils'; -import { Bounds, Point, isString } from '@visactor/vutils'; +import { Bounds, Point, isBase64, isObject, isValidUrl } from '@visactor/vutils'; import type { IGraphic, + IGraphicAttribute, IExportType, IStage, IStageParams, @@ -74,7 +75,7 @@ export class Stage extends Group implements IStage { declare state: IStageState; - private _background: string | IColor; + private _background: IGraphicAttribute['background'] | IColor; protected nextFrameRenderLayerSet: Set; protected willNextFrameRender: boolean; protected _cursor: string; @@ -157,11 +158,12 @@ export class Stage extends Group implements IStage { set dpr(r: number) { this.setDpr(r); } - get background(): string | IColor { + get background(): IGraphicAttribute['background'] | IColor { return this._background ?? DefaultConfig.BACKGROUND; } - set background(b: string | IColor) { + set background(b: IGraphicAttribute['background'] | IColor) { this._background = b; + this.syncBackgroundImage(b); } get defaultLayer(): ILayer { return this.at(0) as unknown as ILayer; @@ -224,6 +226,31 @@ export class Stage extends Group implements IStage { this._ticker.on('tick', this.afterTickCb); } + protected syncBackgroundImage(background: IGraphicAttribute['background'] | IColor) { + const source = (background as any)?.background ?? background; + this.backgroundImg = false; + if (this.isImageBackgroundSource(source)) { + this.loadImage(source, true); + } + } + + protected isImageBackgroundSource(source: any): boolean { + if (!source) { + return false; + } + if (typeof source === 'string') { + return source.startsWith(' = { export const DefaultImageAttribute: Required = { repeatX: 'no-repeat', repeatY: 'no-repeat', + imageMode: undefined, image: '', width: 0, height: 0, maxWidth: 500, maxHeight: 500, + imagePosition: 'top-left', + imageScale: 1, + imageOffsetX: 0, + imageOffsetY: 0, ...DefaultAttribute, fill: true, cornerRadius: 0, diff --git a/packages/vrender-core/src/graphic/graphic.ts b/packages/vrender-core/src/graphic/graphic.ts index bf48f41ea..44eae088d 100644 --- a/packages/vrender-core/src/graphic/graphic.ts +++ b/packages/vrender-core/src/graphic/graphic.ts @@ -1477,7 +1477,14 @@ export abstract class Graphic = Partial = Partial implements IImage { static NOWORK_ANIMATE_ATTR = { image: 1, + imageMode: 1, repeatX: 1, repeatY: 1, ...NOWORK_ANIMATE_ATTR diff --git a/packages/vrender-core/src/interface/graphic.ts b/packages/vrender-core/src/interface/graphic.ts index b0d438df0..5e37a314b 100644 --- a/packages/vrender-core/src/interface/graphic.ts +++ b/packages/vrender-core/src/interface/graphic.ts @@ -313,7 +313,31 @@ export type IBackgroundConfig = { expandY?: number; }; -type IBackgroundType = string | HTMLImageElement | HTMLCanvasElement | IBackgroundConfig; +export type BackgroundSizing = 'cover' | 'contain' | 'fill' | 'auto'; +export type BackgroundRepeatMode = 'repeat' | 'repeat-x' | 'repeat-y' | 'no-repeat'; +export type BackgroundSizingShorthand = 'no-repeat-cover' | 'no-repeat-contain' | 'no-repeat-fill' | 'no-repeat-auto'; +export type BackgroundMode = BackgroundRepeatMode | BackgroundSizingShorthand; +export type BackgroundPositionHorizontalKeyword = 'left' | 'center' | 'right'; +export type BackgroundPositionVerticalKeyword = 'top' | 'center' | 'bottom'; +export type BackgroundPositionKeyword = BackgroundPositionHorizontalKeyword | BackgroundPositionVerticalKeyword; +export type BackgroundPositionPercent = `${number}%`; +export type BackgroundPositionValue = number | BackgroundPositionKeyword | BackgroundPositionPercent; +export type BackgroundPositionPreset = + | 'top-left' + | 'top-center' + | 'top-right' + | 'center-left' + | 'center' + | 'center-right' + | 'bottom-left' + | 'bottom-center' + | 'bottom-right'; +export type BackgroundPosition = + | BackgroundPositionKeyword + | BackgroundPositionPreset + | [BackgroundPositionValue, BackgroundPositionValue]; + +export type IBackgroundType = string | HTMLImageElement | HTMLCanvasElement | IBackgroundConfig; export interface SimpleDomStyleOptions { /** @@ -403,9 +427,11 @@ export type IGraphicStyle = ILayout & */ shadowGraphic?: IGraphic | undefined; /** - * 背景填充模式(与具体图元有关) + * 背景图绘制模式。 + * - repeat/repeat-x/repeat-y/no-repeat: 原有平铺语义 + * - no-repeat-cover/no-repeat-contain/no-repeat-fill/no-repeat-auto: no-repeat 下的尺寸简写 */ - backgroundMode: 'repeat' | 'repeat-x' | 'repeat-y' | 'no-repeat'; + backgroundMode: BackgroundMode; /** * 是否正好填充,只在repeat-x或者repeat-y以及no-repeat的时候生效 */ @@ -426,6 +452,16 @@ export type IGraphicStyle = ILayout & * 背景图偏移,只在no-repeat的时候生效 */ backgroundOffsetY: number; + /** + * 背景图锚定位置(类似 CSS background-position),仅在 no-repeat 的图片背景下生效。 + * 默认值为 'top-left',当前公开支持以下几类配置: + * - 单关键字:'left' | 'center' | 'right' | 'top' | 'bottom' + * - 预设位置:'top-left'、'top-center'、'top-right'、'center-left'、'center'、 + * 'center-right'、'bottom-left'、'bottom-center'、'bottom-right' + * - 元组写法:[x, y],其中 x/y 支持 number、关键字、百分比字符串(如 ['25%', '75%']) + * 运行时仍兼容 CSS 风格空格字符串,但不再作为公开类型暴露。 + */ + backgroundPosition: BackgroundPosition; /** * 背景图是否裁切,是否调用clip避免绘制到图元外部 */ diff --git a/packages/vrender-core/src/interface/graphic/image.ts b/packages/vrender-core/src/interface/graphic/image.ts index 8e5d3021d..33b48a5ff 100644 --- a/packages/vrender-core/src/interface/graphic/image.ts +++ b/packages/vrender-core/src/interface/graphic/image.ts @@ -1,6 +1,7 @@ -import type { IGraphicAttribute, IGraphic } from '../graphic'; +import type { BackgroundPosition, BackgroundSizing, IGraphicAttribute, IGraphic } from '../graphic'; export type IRepeatType = 'no-repeat' | 'repeat'; +export type ImageMode = BackgroundSizing; export type IImageAttribute = { /** @@ -19,6 +20,28 @@ export type IImageAttribute = { * 最大高度 */ maxHeight?: number; + /** + * 图像绘制模式。 + * - cover/contain/fill/auto: no-repeat 下的尺寸语义 + * 仅在 repeatX/repeatY 最终为 no-repeat 时生效。 + */ + imageMode?: ImageMode; + /** + * 图像锚定位置,语义与 backgroundPosition 一致。 + */ + imagePosition: BackgroundPosition; + /** + * 图像额外缩放比例,仅在不重复平铺时生效。 + */ + imageScale: number; + /** + * 图像 x 偏移,仅在不重复平铺时生效。 + */ + imageOffsetX: number; + /** + * 图像 y 偏移,仅在不重复平铺时生效。 + */ + imageOffsetY: number; /** * x方向的重复方式 */ diff --git a/packages/vrender-core/src/interface/layer.ts b/packages/vrender-core/src/interface/layer.ts index 48e44d1f9..a2edf9338 100644 --- a/packages/vrender-core/src/interface/layer.ts +++ b/packages/vrender-core/src/interface/layer.ts @@ -8,6 +8,7 @@ import type { Releaseable } from './common'; import type { IContext2d } from './context'; import type { IWindow } from './window'; import { ICanvasLike } from './canvas'; +import type { IGraphicAttribute } from './graphic'; export type LayerMode = 'static' | 'dynamic' | 'virtual'; export interface ILayerParams { @@ -20,7 +21,7 @@ export interface ILayerParams { export interface ILayerDrawParams { renderService: IRenderService; - background?: string | IColor; + background?: IGraphicAttribute['background'] | IColor; updateBounds: boolean; viewBox: IAABBBounds; transMatrix: IMatrix; @@ -31,7 +32,7 @@ export interface IDrawToParams { transMatrix: IMatrix; clear?: boolean; renderService: IRenderService; - background?: string | IColor; + background?: IGraphicAttribute['background'] | IColor; updateBounds: boolean; } diff --git a/packages/vrender-core/src/interface/render.ts b/packages/vrender-core/src/interface/render.ts index f21b0c3b2..75a7b4746 100644 --- a/packages/vrender-core/src/interface/render.ts +++ b/packages/vrender-core/src/interface/render.ts @@ -16,7 +16,7 @@ export interface IRenderServiceDrawParams { context?: IContext2d; // 绘制的区域以及是否需要清屏 - clear?: string | IColor | boolean; + clear?: IGraphicAttribute['background'] | IColor | boolean; viewBox: IBounds; transMatrix?: IMatrixLike; stage: IStage; diff --git a/packages/vrender-core/src/interface/stage.ts b/packages/vrender-core/src/interface/stage.ts index 0a4a6da6f..99f6f836e 100644 --- a/packages/vrender-core/src/interface/stage.ts +++ b/packages/vrender-core/src/interface/stage.ts @@ -14,6 +14,7 @@ import type { IWindow } from './window'; import type { ILayerService } from './core'; import type { IFullThemeSpec } from './graphic/theme'; import type { IGraphicService } from './graphic-service'; +import type { IGraphicAttribute } from './graphic'; export type IExportType = 'canvas' | 'imageData'; @@ -34,7 +35,7 @@ export interface IStageParams { height: number; dpr: number; // stage的背景 - background: string | IColor; + background: IGraphicAttribute['background'] | IColor; // 外部的canvas canvas: string | HTMLCanvasElement; // canvas的container容器,如果不传入canvas,那就会在容器中创建canvas @@ -176,7 +177,7 @@ export interface IStage extends INode { dpr: number; viewBox: IBoundsLike; - background: string | IColor; + background: IGraphicAttribute['background'] | IColor; ticker: ITicker; increaseAutoRender: boolean; readonly renderService: IRenderService; diff --git a/packages/vrender-core/src/render/contributions/render/contributions/base-contribution-render.ts b/packages/vrender-core/src/render/contributions/render/contributions/base-contribution-render.ts index 171dd12a6..1cfa37cc1 100644 --- a/packages/vrender-core/src/render/contributions/render/contributions/base-contribution-render.ts +++ b/packages/vrender-core/src/render/contributions/render/contributions/base-contribution-render.ts @@ -1,5 +1,6 @@ import type { IGraphicAttribute, + BackgroundSizing, IContext2d, IGraphic, IThemeAttribute, @@ -47,15 +48,16 @@ export class DefaultBaseBackgroundRenderContribution implements IBaseRenderContr backgroundScale = graphicAttribute.backgroundScale, backgroundOffsetX = graphicAttribute.backgroundOffsetX, backgroundOffsetY = graphicAttribute.backgroundOffsetY, - backgroundClip = graphicAttribute.backgroundClip + backgroundClip = graphicAttribute.backgroundClip, + backgroundPosition = graphicAttribute.backgroundPosition } = graphic.attribute; if (!background) { return; } if (graphic.backgroundImg && graphic.resources) { - const res = graphic.resources.get(background as any); - if (res.state !== 'success' || !res.data) { + const res = graphic.resources.get(getBackgroundImage(background) as any); + if (!res || res.state !== 'success' || !res.data) { return; } @@ -77,7 +79,8 @@ export class DefaultBaseBackgroundRenderContribution implements IBaseRenderContr backgroundKeepAspectRatio, backgroundScale, backgroundOffsetX, - backgroundOffsetY + backgroundOffsetY, + backgroundPosition }); context.restore(); if (!graphic.transMatrix.onlyTranslate()) { @@ -93,94 +96,299 @@ export class DefaultBaseBackgroundRenderContribution implements IBaseRenderContr } } - protected doDrawImage( - context: IContext2d, - data: any, - b: IBounds, - params: { - backgroundMode: 'repeat' | 'repeat-x' | 'repeat-y' | 'no-repeat'; - backgroundFit: boolean; - backgroundKeepAspectRatio: boolean; - backgroundScale?: number; - backgroundOffsetX?: number; - backgroundOffsetY?: number; - } - ): void { - const { - backgroundMode, + protected doDrawImage(context: IContext2d, data: any, b: IBounds, params: IBackgroundImageDrawParams): void { + drawBackgroundImage(context, data, b, params); + } +} + +export const defaultBaseBackgroundRenderContribution = new DefaultBaseBackgroundRenderContribution(); + +export type IBackgroundImageDrawParams = { + backgroundMode: IGraphicAttribute['backgroundMode']; + backgroundFit: boolean; + backgroundKeepAspectRatio: boolean; + backgroundScale?: number; + backgroundOffsetX?: number; + backgroundOffsetY?: number; + backgroundPosition?: IGraphicAttribute['backgroundPosition']; +}; + +type BackgroundPositionValue = number | string; + +const verticalPositionKeywords = new Set(['top', 'center', 'bottom']); + +export function getBackgroundImage(background: any) { + return background?.background ?? background; +} + +export function resolveBackgroundSizing({ + backgroundFit, + backgroundKeepAspectRatio +}: Pick): NonNullable { + if (backgroundFit) { + return backgroundKeepAspectRatio ? 'cover' : 'fill'; + } + return 'auto'; +} + +export function isNoRepeatSizingMode( + mode: IGraphicAttribute['backgroundMode'] +): mode is Extract { + return typeof mode === 'string' && mode.startsWith('no-repeat-'); +} + +const NO_REPEAT_SIZING_MAP: Record = { + 'no-repeat-cover': 'cover', + 'no-repeat-contain': 'contain', + 'no-repeat-fill': 'fill', + 'no-repeat-auto': 'auto' +}; + +export function resolveBackgroundDrawMode({ + backgroundMode, + backgroundFit, + backgroundKeepAspectRatio +}: Pick): { + backgroundRepeatMode: 'repeat' | 'repeat-x' | 'repeat-y' | 'no-repeat'; + backgroundSizing: BackgroundSizing; +} { + const sizing = NO_REPEAT_SIZING_MAP[backgroundMode]; + if (sizing) { + return { + backgroundRepeatMode: 'no-repeat', + backgroundSizing: sizing + }; + } + + return { + backgroundRepeatMode: backgroundMode as 'repeat' | 'repeat-x' | 'repeat-y' | 'no-repeat', + backgroundSizing: resolveBackgroundSizing({ backgroundFit, - backgroundKeepAspectRatio, - backgroundScale = 1, - backgroundOffsetX = 0, - backgroundOffsetY = 0 - } = params; - const targetW = b.width(); - const targetH = b.height(); - let w = targetW; - let h = targetH; - if (backgroundMode === 'no-repeat') { - if (backgroundFit) { - if (!backgroundKeepAspectRatio) { - context.drawImage(data, b.x1, b.y1, b.width(), b.height()); - } else { - const maxScale = Math.max(targetW / data.width, targetH / data.height); - context.drawImage( - data, - b.x1 + backgroundOffsetX, - b.y1 + backgroundOffsetY, - data.width * maxScale * backgroundScale, - data.height * maxScale * backgroundScale - ); - } - } else { - const resW = data.width * backgroundScale; - const resH = data.height * backgroundScale; - context.drawImage(data, b.x1 + backgroundOffsetX, b.y1 + backgroundOffsetY, resW, resH); - } - } else { - // debugger; - // TODO 考虑缓存 - if (backgroundFit && backgroundMode !== 'repeat' && (data.width || data.height)) { - const resW = data.width; - const resH = data.height; - - if (backgroundMode === 'repeat-x') { - // 高度适应 - const ratio = targetH / resH; - w = resW * ratio; - h = targetH; - } else if (backgroundMode === 'repeat-y') { - // 宽度适应 - const ratio = targetW / resW; - h = resH * ratio; - w = targetW; - } - - const dpr = context.dpr; - const canvas = canvasAllocate.allocate({ width: w, height: h, dpr }); - const ctx = canvas.getContext('2d'); - if (ctx) { - ctx.inuse = true; - ctx.clearMatrix(); - ctx.setTransformForCurrent(true); - ctx.clearRect(0, 0, w, h); - ctx.drawImage(data, 0, 0, w, h); - data = canvas.nativeCanvas; - } - canvasAllocate.free(canvas); - } - const dpr = context.dpr; - const pattern = context.createPattern(data, backgroundMode); - pattern.setTransform && pattern.setTransform(new DOMMatrix([1 / dpr, 0, 0, 1 / dpr, 0, 0])); - context.fillStyle = pattern; - context.translate(b.x1, b.y1); - context.fillRect(0, 0, targetW, targetH); - context.translate(-b.x1, -b.y1); + backgroundKeepAspectRatio + }) + }; +} + +function isPercentageValue(value: string): boolean { + return /^-?\d+(\.\d+)?%$/.test(value); +} + +function parsePositionToken( + value: BackgroundPositionValue, + remainSpace: number, + startKeyword: 'left' | 'top', + centerKeyword: 'center', + endKeyword: 'right' | 'bottom' +): number { + if (typeof value === 'number' && Number.isFinite(value)) { + return value; + } + + const normalizedValue = `${value ?? ''}`.trim().toLowerCase(); + + if (!normalizedValue || normalizedValue === startKeyword) { + return 0; + } + if (normalizedValue === centerKeyword) { + return remainSpace / 2; + } + if (normalizedValue === endKeyword) { + return remainSpace; + } + if (isPercentageValue(normalizedValue)) { + return (remainSpace * parseFloat(normalizedValue)) / 100; + } + + const parsedValue = Number(normalizedValue); + if (Number.isFinite(parsedValue)) { + return parsedValue; + } + + return 0; +} + +function normalizeBackgroundPosition( + position?: IGraphicAttribute['backgroundPosition'] +): [BackgroundPositionValue, BackgroundPositionValue] { + if (Array.isArray(position)) { + return [position[0] ?? 'left', position[1] ?? 'top']; + } + + const normalizedPosition = `${position ?? 'top-left'}`.trim().toLowerCase().replace(/-/g, ' '); + const tokens = normalizedPosition.split(/\s+/).filter(Boolean); + + if (tokens.length === 0) { + return ['left', 'top']; + } + + if (tokens.length === 1) { + const token = tokens[0]; + if (token === 'center') { + return ['center', 'center']; } + if (verticalPositionKeywords.has(token)) { + return ['center', token]; + } + return [token, 'center']; + } + + let horizontal: BackgroundPositionValue | undefined; + let vertical: BackgroundPositionValue | undefined; + const genericTokens: BackgroundPositionValue[] = []; + + for (let i = 0; i < 2; i++) { + const token = tokens[i]; + if (token === 'left' || token === 'right') { + horizontal = token; + continue; + } + if (token === 'top' || token === 'bottom') { + vertical = token; + continue; + } + genericTokens.push(token); + } + + if (horizontal == null && genericTokens.length) { + horizontal = genericTokens.shift(); } + if (vertical == null && genericTokens.length) { + vertical = genericTokens.shift(); + } + + return [horizontal ?? 'left', vertical ?? 'top']; } -export const defaultBaseBackgroundRenderContribution = new DefaultBaseBackgroundRenderContribution(); +export function resolveBackgroundPosition( + position: IGraphicAttribute['backgroundPosition'], + remainWidth: number, + remainHeight: number +) { + const [horizontalPosition, verticalPosition] = normalizeBackgroundPosition(position); + return { + x: parsePositionToken(horizontalPosition, remainWidth, 'left', 'center', 'right'), + y: parsePositionToken(verticalPosition, remainHeight, 'top', 'center', 'bottom') + }; +} + +function pickRenderableDimension(...values: any[]): number | null { + for (const value of values) { + if (typeof value === 'number' && Number.isFinite(value) && value > 0) { + return value; + } + } + return null; +} + +export function resolveRenderableImageSize(data: any): { width: number; height: number } | null { + if (!data) { + return null; + } + + // DOM image-like resources may expose intrinsic size on naturalWidth/videoWidth + // while width/height stays 0, so prefer intrinsic dimensions when available. + const width = pickRenderableDimension(data.naturalWidth, data.videoWidth, data.width); + const height = pickRenderableDimension(data.naturalHeight, data.videoHeight, data.height); + + if (width == null || height == null) { + return null; + } + + return { width, height }; +} + +export function drawBackgroundImage( + context: IContext2d, + data: any, + b: IBounds, + params: IBackgroundImageDrawParams +): void { + const { + backgroundMode, + backgroundFit, + backgroundKeepAspectRatio, + backgroundScale = 1, + backgroundOffsetX = 0, + backgroundOffsetY = 0, + backgroundPosition = 'top-left' + } = params; + const targetW = b.width(); + const targetH = b.height(); + const sourceSize = resolveRenderableImageSize(data); + const { backgroundRepeatMode, backgroundSizing: resolvedBackgroundSizing } = resolveBackgroundDrawMode({ + backgroundMode, + backgroundFit, + backgroundKeepAspectRatio + }); + let w = targetW; + let h = targetH; + + if (targetW <= 0 || targetH <= 0) { + return; + } + + if (backgroundRepeatMode === 'no-repeat') { + let drawWidth = sourceSize?.width ?? targetW; + let drawHeight = sourceSize?.height ?? targetH; + + if ((resolvedBackgroundSizing === 'cover' || resolvedBackgroundSizing === 'contain') && sourceSize) { + const scale = + resolvedBackgroundSizing === 'cover' + ? Math.max(targetW / sourceSize.width, targetH / sourceSize.height) + : Math.min(targetW / sourceSize.width, targetH / sourceSize.height); + drawWidth = sourceSize.width * scale; + drawHeight = sourceSize.height * scale; + } else if (resolvedBackgroundSizing === 'fill') { + drawWidth = targetW; + drawHeight = targetH; + } + + drawWidth *= backgroundScale; + drawHeight *= backgroundScale; + + const { x, y } = resolveBackgroundPosition(backgroundPosition, targetW - drawWidth, targetH - drawHeight); + context.drawImage(data, b.x1 + x + backgroundOffsetX, b.y1 + y + backgroundOffsetY, drawWidth, drawHeight); + return; + } + + // TODO 考虑缓存 + if (backgroundFit && backgroundRepeatMode !== 'repeat' && sourceSize) { + const resW = sourceSize.width; + const resH = sourceSize.height; + + if (backgroundRepeatMode === 'repeat-x') { + // 高度适应 + const ratio = targetH / resH; + w = resW * ratio; + h = targetH; + } else if (backgroundRepeatMode === 'repeat-y') { + // 宽度适应 + const ratio = targetW / resW; + h = resH * ratio; + w = targetW; + } + + const dpr = context.dpr; + const canvas = canvasAllocate.allocate({ width: w, height: h, dpr }); + const ctx = canvas.getContext('2d'); + if (ctx) { + ctx.inuse = true; + ctx.clearMatrix(); + ctx.setTransformForCurrent(true); + ctx.clearRect(0, 0, w, h); + ctx.drawImage(data, 0, 0, w, h); + data = canvas.nativeCanvas; + } + canvasAllocate.free(canvas); + } + const dpr = context.dpr; + const pattern = context.createPattern(data, backgroundRepeatMode); + pattern.setTransform && pattern.setTransform(new DOMMatrix([1 / dpr, 0, 0, 1 / dpr, 0, 0])); + context.fillStyle = pattern; + context.translate(b.x1, b.y1); + context.fillRect(0, 0, targetW, targetH); + context.translate(-b.x1, -b.y1); +} export interface IInteractiveSubRenderContribution { render: ( diff --git a/packages/vrender-core/src/render/contributions/render/contributions/group-contribution-render.ts b/packages/vrender-core/src/render/contributions/render/contributions/group-contribution-render.ts index b9e526570..42fa6b313 100644 --- a/packages/vrender-core/src/render/contributions/render/contributions/group-contribution-render.ts +++ b/packages/vrender-core/src/render/contributions/render/contributions/group-contribution-render.ts @@ -6,7 +6,7 @@ import type { IGroupRenderContribution, IDrawContext } from '../../../../interface'; -import { DefaultBaseBackgroundRenderContribution } from './base-contribution-render'; +import { DefaultBaseBackgroundRenderContribution, getBackgroundImage } from './base-contribution-render'; import { BaseRenderContributionTime } from '../../../../common/enums'; export class DefaultGroupBackgroundRenderContribution @@ -31,20 +31,24 @@ export class DefaultGroupBackgroundRenderContribution ) { const { background, + backgroundOpacity = graphicAttribute.backgroundOpacity, + opacity = graphicAttribute.opacity, backgroundMode = graphicAttribute.backgroundMode, backgroundFit = graphicAttribute.backgroundFit, backgroundKeepAspectRatio = graphicAttribute.backgroundKeepAspectRatio, backgroundScale = graphicAttribute.backgroundScale, backgroundOffsetX = graphicAttribute.backgroundOffsetX, - backgroundOffsetY = graphicAttribute.backgroundOffsetY + backgroundOffsetY = graphicAttribute.backgroundOffsetY, + backgroundClip = graphicAttribute.backgroundClip, + backgroundPosition = graphicAttribute.backgroundPosition } = graphic.attribute; if (!background) { return; } if (graphic.backgroundImg && graphic.resources) { - const res = graphic.resources.get(background as any); - if (res.state !== 'success' || !res.data) { + const res = graphic.resources.get(getBackgroundImage(background) as any); + if (!res || res.state !== 'success' || !res.data) { return; } @@ -52,18 +56,22 @@ export class DefaultGroupBackgroundRenderContribution context.setTransformFromMatrix(graphic.parent.globalTransMatrix, true); const b = graphic.AABBBounds; + context.globalAlpha = backgroundOpacity * opacity; + backgroundClip && context.clip(); this.doDrawImage(context, res.data, b, { backgroundMode, backgroundFit, backgroundKeepAspectRatio, backgroundScale, backgroundOffsetX, - backgroundOffsetY + backgroundOffsetY, + backgroundPosition }); context.highPerformanceRestore(); context.setTransformForCurrent(); } else { context.highPerformanceSave(); + context.globalAlpha = backgroundOpacity * opacity; context.fillStyle = background as string; context.fill(); context.highPerformanceRestore(); diff --git a/packages/vrender-core/src/render/contributions/render/contributions/text-contribution-render.ts b/packages/vrender-core/src/render/contributions/render/contributions/text-contribution-render.ts index 677c42866..46c05c4db 100644 --- a/packages/vrender-core/src/render/contributions/render/contributions/text-contribution-render.ts +++ b/packages/vrender-core/src/render/contributions/render/contributions/text-contribution-render.ts @@ -35,9 +35,17 @@ export class DefaultTextBackgroundRenderContribution strokeCb?: (ctx: IContext2d, markAttribute: Partial, themeAttribute: IThemeAttribute) => boolean ) { const { + backgroundOpacity = graphicAttribute.backgroundOpacity, + opacity = graphicAttribute.opacity, backgroundMode = graphicAttribute.backgroundMode, backgroundFit = graphicAttribute.backgroundFit, - backgroundKeepAspectRatio = graphicAttribute.backgroundKeepAspectRatio + backgroundKeepAspectRatio = graphicAttribute.backgroundKeepAspectRatio, + backgroundScale = graphicAttribute.backgroundScale, + backgroundOffsetX = graphicAttribute.backgroundOffsetX, + backgroundOffsetY = graphicAttribute.backgroundOffsetY, + backgroundPosition = graphicAttribute.backgroundPosition, + backgroundClip = graphicAttribute.backgroundClip, + backgroundCornerRadius = graphicAttribute.backgroundCornerRadius } = graphic.attribute; let { background } = graphic.attribute; if (!background) { @@ -61,22 +69,22 @@ export class DefaultTextBackgroundRenderContribution }; save(); let b: IAABBBounds; - const shouldReCalBounds = isObject(background) && (background as any).background; + const backgroundConfig = isObject(background) && (background as any).background ? (background as any) : null; const onlyTranslate = graphic.transMatrix.onlyTranslate(); - if (shouldReCalBounds) { + if (backgroundConfig) { const _b = graphic.AABBBounds; - const x = ((background as any).x ?? _b.x1) + ((background as any).dx ?? 0); - const y = ((background as any).y ?? _b.y1) + ((background as any).dy ?? 0); - const w = (background as any).width ?? _b.width(); - const h = (background as any).height ?? _b.height(); + const x = (backgroundConfig.x ?? _b.x1) + (backgroundConfig.dx ?? 0); + const y = (backgroundConfig.y ?? _b.y1) + (backgroundConfig.dy ?? 0); + const w = backgroundConfig.width ?? _b.width(); + const h = backgroundConfig.height ?? _b.height(); b = boundsAllocate.allocate(x, y, x + w, y + h); - background = (background as any).background; + background = backgroundConfig.background; if (!onlyTranslate) { const w = b.width(); const h = b.height(); b.set( - ((background as any).x ?? 0) + ((background as any).dx ?? 0), - ((background as any).y ?? 0) + ((background as any).dy ?? 0), + (backgroundConfig.x ?? 0) + (backgroundConfig.dx ?? 0), + (backgroundConfig.y ?? 0) + (backgroundConfig.dy ?? 0), w, h ); @@ -90,7 +98,7 @@ export class DefaultTextBackgroundRenderContribution if (graphic.backgroundImg && graphic.resources) { const res = graphic.resources.get(background as any); - if (res.state !== 'success' || !res.data) { + if (!res || res.state !== 'success' || !res.data) { restore(); return; } @@ -105,15 +113,31 @@ export class DefaultTextBackgroundRenderContribution context.setTransformFromMatrix(graphic.parent.globalTransMatrix, true); } - context.setCommonStyle(graphic, graphic.attribute, x, y, graphicAttribute); - this.doDrawImage(context, res.data, b, { backgroundMode, backgroundFit, backgroundKeepAspectRatio }); + context.globalAlpha = backgroundOpacity * opacity; + if (backgroundClip) { + context.beginPath(); + if (backgroundCornerRadius) { + createRectPath(context, b.x1, b.y1, b.width(), b.height(), backgroundCornerRadius, true); + } else { + context.rect(b.x1, b.y1, b.width(), b.height()); + } + context.clip(); + } + this.doDrawImage(context, res.data, b, { + backgroundMode, + backgroundFit, + backgroundKeepAspectRatio, + backgroundScale, + backgroundOffsetX, + backgroundOffsetY, + backgroundPosition + }); context.highPerformanceRestore(); context.setTransformForCurrent(); } else { - const { backgroundCornerRadius, backgroundOpacity = 1 } = graphic.attribute; context.highPerformanceSave(); context.setCommonStyle(graphic, graphic.attribute, x, y, graphicAttribute); - context.globalAlpha = backgroundOpacity; + context.globalAlpha = backgroundOpacity * opacity; context.fillStyle = background as string; if (backgroundCornerRadius) { // 测试后,cache对于重绘性能提升不大,但是在首屏有一定性能损耗,因此rect不再使用cache @@ -125,7 +149,7 @@ export class DefaultTextBackgroundRenderContribution context.highPerformanceRestore(); } - if (shouldReCalBounds) { + if (backgroundConfig) { boundsAllocate.free(b); } restore(); diff --git a/packages/vrender-core/src/render/contributions/render/draw-contribution.ts b/packages/vrender-core/src/render/contributions/render/draw-contribution.ts index 59b6b1248..f55c27167 100644 --- a/packages/vrender-core/src/render/contributions/render/draw-contribution.ts +++ b/packages/vrender-core/src/render/contributions/render/draw-contribution.ts @@ -27,6 +27,7 @@ import type { ILayerService } from '../../../interface/core'; import { boundsAllocate } from '../../../allocator/bounds-allocate'; import { matrixAllocate } from '../../../allocator/matrix-allocate'; import { application } from '../../../application'; +import { drawBackgroundImage, getBackgroundImage } from './contributions/base-contribution-render'; /** * 默认的渲染contribution,基于树状结构针对图元的渲染 @@ -475,16 +476,30 @@ export class DefaultDrawContribution implements IDrawContribution { renderService.drawParams.stage.hooks.afterClearRect.call(renderService.drawParams); } const stage = renderService.drawParams?.stage; - stage && (context.globalAlpha = (stage as any).attribute.opacity ?? 1); + if (stage) { + context.globalAlpha = + ((stage as any).attribute.opacity ?? 1) * ((stage as any).attribute.backgroundOpacity ?? 1); + } if (stage && (stage as any).backgroundImg && (stage as any).resources) { - const res = (stage as any).resources.get(clear); + const res = (stage as any).resources.get(getBackgroundImage(clear)); if (res && res.state === 'success' && res.data) { - context.drawImage(res.data, x, y, width, height); + const backgroundBounds = boundsAllocate.allocate(x, y, x + width, y + height); + drawBackgroundImage(context, res.data, backgroundBounds, { + backgroundMode: (stage as any).attribute.backgroundMode ?? DefaultAttribute.backgroundMode, + backgroundFit: (stage as any).attribute.backgroundFit ?? DefaultAttribute.backgroundFit, + backgroundKeepAspectRatio: + (stage as any).attribute.backgroundKeepAspectRatio ?? DefaultAttribute.backgroundKeepAspectRatio, + backgroundScale: (stage as any).attribute.backgroundScale ?? DefaultAttribute.backgroundScale, + backgroundOffsetX: (stage as any).attribute.backgroundOffsetX ?? DefaultAttribute.backgroundOffsetX, + backgroundOffsetY: (stage as any).attribute.backgroundOffsetY ?? DefaultAttribute.backgroundOffsetY, + backgroundPosition: (stage as any).attribute.backgroundPosition ?? DefaultAttribute.backgroundPosition + }); + boundsAllocate.free(backgroundBounds); } } else { context.fillStyle = createColor( context, - clear, + clear as any, { AABBBounds: { x1: x, y1: y, x2: x + width, y2: y + height } }, diff --git a/packages/vrender-core/src/render/contributions/render/image-render.ts b/packages/vrender-core/src/render/contributions/render/image-render.ts index 83c4cac25..b6329b848 100644 --- a/packages/vrender-core/src/render/contributions/render/image-render.ts +++ b/packages/vrender-core/src/render/contributions/render/image-render.ts @@ -6,7 +6,10 @@ import type { IGraphicAttribute, IContext2d, IMarkAttribute, + BackgroundSizing, + BackgroundMode, IImage, + IImageGraphicAttribute, IThemeAttribute, IGraphicRender, IImageRenderContribution, @@ -16,17 +19,143 @@ import type { IRenderService } from '../../../interface'; import { ImageRenderContribution } from './contributions/constants'; -import { fillVisible, runFill } from './utils'; import { IMAGE_NUMBER_TYPE } from '../../../graphic/constants'; -import { BaseRenderContributionTime } from '../../../common/enums'; import { isArray, isString } from '@visactor/vutils'; import { createRectPath } from '../../../common/shape/rect'; import { BaseRender } from './base-render'; import { defaultImageBackgroundRenderContribution, defaultImageRenderContribution } from './contributions'; import { ResourceLoader } from '../../../resource-loader/loader'; +import { drawBackgroundImage } from './contributions/base-contribution-render'; const repeatStr = ['', 'repeat-x', 'repeat-y', 'repeat']; +export type IImageLayoutDrawParams = Pick< + IImageGraphicAttribute, + 'repeatX' | 'repeatY' | 'imageMode' | 'imageScale' | 'imageOffsetX' | 'imageOffsetY' | 'imagePosition' +>; + +export function resolveImageMode({ + repeatX = 'no-repeat', + repeatY = 'no-repeat', + imageMode +}: Pick): { + repeatMode: 'repeat' | 'repeat-x' | 'repeat-y' | 'no-repeat'; + sizingMode: BackgroundSizing; +} { + const repeatMode = resolveImageRepeatMode(repeatX, repeatY); + + return { + repeatMode, + sizingMode: repeatMode === 'no-repeat' ? imageMode ?? 'fill' : 'fill' + }; +} + +const IMAGE_MODE_TO_BACKGROUND_MODE: Record = { + cover: 'no-repeat-cover', + contain: 'no-repeat-contain', + fill: 'no-repeat-fill', + auto: 'no-repeat-auto' +}; + +export function resolveBackgroundParamsByImageSizing(sizingMode: BackgroundSizing): { + backgroundMode: BackgroundMode; + backgroundFit: boolean; + backgroundKeepAspectRatio: boolean; +} { + return { + backgroundMode: IMAGE_MODE_TO_BACKGROUND_MODE[sizingMode], + backgroundFit: false, + backgroundKeepAspectRatio: false + }; +} + +export function resolveImageRepeatMode( + repeatX: IImageGraphicAttribute['repeatX'], + repeatY: IImageGraphicAttribute['repeatY'] +): 'repeat' | 'repeat-x' | 'repeat-y' | 'no-repeat' { + let repeat = 0; + if (repeatX === 'repeat') { + repeat |= 0b0001; + } + if (repeatY === 'repeat') { + repeat |= 0b0010; + } + return repeat ? (repeatStr[repeat] as 'repeat' | 'repeat-x' | 'repeat-y') : 'no-repeat'; +} + +export function shouldClipImageByLayout({ + repeatX = 'no-repeat', + repeatY = 'no-repeat', + imageMode, + imageScale = 1, + imageOffsetX = 0, + imageOffsetY = 0, + imagePosition = 'top-left' +}: IImageLayoutDrawParams): boolean { + const { repeatMode, sizingMode } = resolveImageMode({ + repeatX, + repeatY, + imageMode + }); + return ( + repeatMode === 'no-repeat' && + (sizingMode === 'cover' || sizingMode === 'auto' || imageScale !== 1 || imageOffsetX !== 0 || imageOffsetY !== 0) + ); +} + +export function drawImageWithLayout( + context: IContext2d, + data: any, + x: number, + y: number, + width: number, + height: number, + { + repeatX = 'no-repeat', + repeatY = 'no-repeat', + imageMode, + imageScale = 1, + imageOffsetX = 0, + imageOffsetY = 0, + imagePosition = 'top-left' + }: IImageLayoutDrawParams +) { + const { repeatMode, sizingMode } = resolveImageMode({ + repeatX, + repeatY, + imageMode + }); + const imageBackgroundParams = + repeatMode === 'no-repeat' + ? resolveBackgroundParamsByImageSizing(sizingMode) + : { + backgroundMode: repeatMode, + backgroundFit: false, + backgroundKeepAspectRatio: false + }; + drawBackgroundImage( + context, + data, + { + x1: x, + y1: y, + x2: x + width, + y2: y + height, + width: () => width, + height: () => height + } as any, + { + backgroundMode: imageBackgroundParams.backgroundMode, + backgroundFit: imageBackgroundParams.backgroundFit, + backgroundKeepAspectRatio: imageBackgroundParams.backgroundKeepAspectRatio, + backgroundScale: imageScale, + backgroundOffsetX: imageOffsetX, + backgroundOffsetY: imageOffsetY, + backgroundPosition: imagePosition + } + ); +} + @injectable() export class DefaultCanvasImageRender extends BaseRender implements IGraphicRender { type: 'image'; @@ -70,6 +199,11 @@ export class DefaultCanvasImageRender extends BaseRender implements IGra cornerRadius = imageAttribute.cornerRadius, fillStrokeOrder = imageAttribute.fillStrokeOrder, cornerType = imageAttribute.cornerType, + imageMode = imageAttribute.imageMode, + imageScale = imageAttribute.imageScale, + imageOffsetX = imageAttribute.imageOffsetX, + imageOffsetY = imageAttribute.imageOffsetY, + imagePosition = imageAttribute.imagePosition, image: url } = image.attribute; @@ -92,14 +226,14 @@ export class DefaultCanvasImageRender extends BaseRender implements IGra context.beginPath(); // deal with cornerRadius - let needRestore = false; + let needCornerClip = false; if (cornerRadius === 0 || (isArray(cornerRadius) && (cornerRadius).every(num => num === 0))) { // 不需要处理圆角 context.rect(x, y, width, height); } else { // context.beginPath(); createRectPath(context, x, y, width, height, cornerRadius, cornerType !== 'bevel'); - needRestore = true; + needCornerClip = true; } // shadow @@ -113,22 +247,15 @@ export class DefaultCanvasImageRender extends BaseRender implements IGra fillCb(context, image.attribute, imageAttribute); } else if (fVisible) { context.setCommonStyle(image, image.attribute, x, y, imageAttribute); - let repeat = 0; - if (repeatX === 'repeat') { - repeat |= 0b0001; - } - if (repeatY === 'repeat') { - repeat |= 0b0010; - } - if (repeat) { - const pattern = context.createPattern(res.data, repeatStr[repeat]); - context.fillStyle = pattern; - context.translate(x, y, true); - context.fillRect(0, 0, width, height); - context.translate(-x, -y, true); - } else { - context.drawImage(res.data, x, y, width, height); - } + drawImageWithLayout(context, res.data, x, y, width, height, { + repeatX, + repeatY, + imageMode, + imageScale, + imageOffsetX, + imageOffsetY, + imagePosition + }); } } }; @@ -144,26 +271,37 @@ export class DefaultCanvasImageRender extends BaseRender implements IGra } }; + const needLayoutClip = shouldClipImageByLayout({ + repeatX, + repeatY, + imageMode, + imageScale, + imageOffsetX, + imageOffsetY, + imagePosition + }); + const needClip = needCornerClip || needLayoutClip; + if (!fillStrokeOrder) { - if (needRestore) { + if (needClip) { context.save(); context.clip(); } this.beforeRenderStep(image, context, x, y, doFill, false, fVisible, false, imageAttribute, drawContext, fillCb); _runFill(); - if (needRestore) { + if (needClip) { context.restore(); } _runStroke(); } else { _runStroke(); - if (needRestore) { + if (needClip) { context.save(); context.clip(); } this.beforeRenderStep(image, context, x, y, doFill, false, fVisible, false, imageAttribute, drawContext, fillCb); _runFill(); - if (needRestore) { + if (needClip) { context.restore(); } } diff --git a/packages/vrender-kits/CHANGELOG.json b/packages/vrender-kits/CHANGELOG.json index ad902ec09..521f629a0 100644 --- a/packages/vrender-kits/CHANGELOG.json +++ b/packages/vrender-kits/CHANGELOG.json @@ -4,7 +4,7 @@ { "version": "1.0.43", "tag": "@visactor/vrender-kits_v1.0.43", - "date": "Tue, 24 Mar 2026 13:05:47 GMT", + "date": "Thu, 02 Apr 2026 03:43:37 GMT", "comments": {} }, { diff --git a/packages/vrender-kits/CHANGELOG.md b/packages/vrender-kits/CHANGELOG.md index 7acb71bb3..d5bf719e4 100644 --- a/packages/vrender-kits/CHANGELOG.md +++ b/packages/vrender-kits/CHANGELOG.md @@ -1,16 +1,9 @@ # Change Log - @visactor/vrender-kits -<<<<<<< release/1.0.44 -This log was last generated on Wed, 25 Mar 2026 09:15:13 GMT and should not be manually modified. +This log was last generated on Thu, 02 Apr 2026 03:43:37 GMT and should not be manually modified. ## 1.0.43 -Wed, 25 Mar 2026 09:15:13 GMT -======= -This log was last generated on Tue, 24 Mar 2026 13:05:47 GMT and should not be manually modified. - -## 1.0.43 -Tue, 24 Mar 2026 13:05:47 GMT ->>>>>>> main +Thu, 02 Apr 2026 03:43:37 GMT _Version update only_ diff --git a/packages/vrender/CHANGELOG.json b/packages/vrender/CHANGELOG.json index 2f92ab099..e056cfb0e 100644 --- a/packages/vrender/CHANGELOG.json +++ b/packages/vrender/CHANGELOG.json @@ -4,12 +4,14 @@ { "version": "1.0.43", "tag": "@visactor/vrender_v1.0.43", -<<<<<<< release/1.0.44 - "date": "Wed, 25 Mar 2026 09:15:13 GMT", -======= - "date": "Tue, 24 Mar 2026 13:05:47 GMT", ->>>>>>> main - "comments": {} + "date": "Thu, 02 Apr 2026 03:43:37 GMT", + "comments": { + "none": [ + { + "comment": "feat: enhance background handling in rendering\n\n" + } + ] + } }, { "version": "1.0.42", diff --git a/packages/vrender/CHANGELOG.md b/packages/vrender/CHANGELOG.md index 5dd1cdf35..f2b551a77 100644 --- a/packages/vrender/CHANGELOG.md +++ b/packages/vrender/CHANGELOG.md @@ -1,18 +1,15 @@ # Change Log - @visactor/vrender -<<<<<<< release/1.0.44 -This log was last generated on Wed, 25 Mar 2026 09:15:13 GMT and should not be manually modified. +This log was last generated on Thu, 02 Apr 2026 03:43:37 GMT and should not be manually modified. ## 1.0.43 -Wed, 25 Mar 2026 09:15:13 GMT -======= -This log was last generated on Tue, 24 Mar 2026 13:05:47 GMT and should not be manually modified. +Thu, 02 Apr 2026 03:43:37 GMT + +### Updates + +- feat: enhance background handling in rendering -## 1.0.43 -Tue, 24 Mar 2026 13:05:47 GMT ->>>>>>> main -_Version update only_ ## 1.0.42 Mon, 23 Mar 2026 08:08:45 GMT diff --git a/packages/vrender/__tests__/browser/src/pages/background.ts b/packages/vrender/__tests__/browser/src/pages/background.ts new file mode 100644 index 000000000..11271d8b2 --- /dev/null +++ b/packages/vrender/__tests__/browser/src/pages/background.ts @@ -0,0 +1,281 @@ +import { createGroup, createRect, createStage, createText, IGraphic, IGraphicAttribute } from '@visactor/vrender'; + +const demoImage = ` + + + + + + + + + + + + VRender BG +`; + +type LayoutSpec = { + title: string; + description: string; + background: Partial; +}; + +type PositionSpec = { + title: string; + position: IGraphicAttribute['backgroundPosition']; +}; + +const layoutSpecs: LayoutSpec[] = [ + { + title: 'cover', + description: '等比放大并裁剪', + background: { + backgroundMode: 'no-repeat-cover', + backgroundPosition: 'center' + } + }, + { + title: 'contain', + description: '等比缩放完整包含', + background: { + backgroundMode: 'no-repeat-contain', + backgroundPosition: 'center' + } + }, + { + title: 'fill', + description: '拉伸填满图元', + background: { + backgroundMode: 'no-repeat-fill', + backgroundPosition: 'center' + } + }, + { + title: 'auto', + description: '按原始尺寸显示', + background: { + backgroundMode: 'no-repeat-auto', + backgroundPosition: 'center' + } + } +]; + +const positionSpecs: PositionSpec[] = [ + { + title: 'top-left', + position: 'top-left' + }, + { + title: 'center', + position: 'center' + }, + { + title: 'bottom-right', + position: 'bottom-right' + }, + { + title: '25% 75%', + position: ['25%', '75%'] + } +]; + +function createCaption(text: string, x: number, y: number, fontSize: number = 18) { + return createText({ + x, + y, + text, + fontSize, + fill: '#17324d', + textBaseline: 'top', + fontFamily: 'Arial' + }); +} + +function createHint(text: string, x: number, y: number) { + return createText({ + x, + y, + text, + fontSize: 13, + fill: '#61758a', + textBaseline: 'top', + fontFamily: 'Arial' + }); +} + +function createDemoFrame( + x: number, + y: number, + width: number, + height: number, + title: string, + attrs: Partial +) { + const graphics: IGraphic[] = []; + + graphics.push( + createRect({ + x, + y, + width, + height, + fill: '#f7f3eb', + stroke: '#d5c7b8', + lineWidth: 1, + cornerRadius: 16 + }) + ); + + graphics.push( + createRect({ + x: x + 18, + y: y + 42, + width: width - 36, + height: height - 60, + cornerRadius: 14, + stroke: '#102a43', + lineWidth: 1, + background: demoImage, + backgroundClip: true, + ...attrs + }) + ); + + graphics.push(createCaption(title, x + 18, y + 14, 16)); + return graphics; +} + +export const page = () => { + const stage = createStage({ + canvas: 'main', + width: 1600, + height: 900, + autoRender: true, + background: { + background: demoImage, + width: 1600, + height: 900 + } + }); + + stage.setAttributes({ + backgroundMode: 'no-repeat-cover', + backgroundPosition: 'center', + backgroundOpacity: 0.12 + }); + + const graphics: IGraphic[] = []; + + graphics.push( + createRect({ + x: 36, + y: 28, + width: 1520, + height: 844, + fill: '#fffdf9', + cornerRadius: 28, + shadowBlur: 24, + shadowColor: 'rgba(19, 50, 75, 0.12)' + }) + ); + + graphics.push(createCaption('Background Image Layout Demo', 72, 58, 28)); + graphics.push(createHint('cover / contain / fill / auto + position + stage/group/text', 72, 96)); + + layoutSpecs.forEach((spec, index) => { + const x = 72 + index * 360; + const y = 150; + graphics.push(...createDemoFrame(x, y, 320, 230, spec.title, spec.background)); + graphics.push(createHint(spec.description, x + 18, y + 188)); + }); + + graphics.push(createCaption('Position Anchors', 72, 430, 22)); + graphics.push(createHint('同一张图片在 cover 模式下使用不同对齐点', 72, 460)); + + positionSpecs.forEach((spec, index) => { + const x = 72 + index * 360; + const y = 500; + graphics.push( + ...createDemoFrame(x, y, 320, 220, spec.title, { + backgroundMode: 'no-repeat-cover', + backgroundPosition: spec.position + }) + ); + }); + + const group = createGroup({ + x: 1160, + y: 500, + width: 340, + height: 220, + cornerRadius: 20, + clip: true, + background: demoImage, + backgroundMode: 'no-repeat-contain', + backgroundPosition: 'bottom-right', + backgroundClip: true + }); + group.add( + createText({ + x: 20, + y: 18, + text: 'group background', + fontSize: 18, + fill: '#17324d', + textBaseline: 'top', + fontFamily: 'Arial' + }) + ); + group.add( + createRect({ + x: 20, + y: 56, + width: 120, + height: 120, + fill: 'rgba(255,255,255,0.82)', + cornerRadius: 14, + stroke: '#17324d', + lineWidth: 1 + }) + ); + group.add( + createText({ + x: 166, + y: 74, + text: 'contain\nright bottom', + fontSize: 18, + fill: '#17324d', + textBaseline: 'top', + fontFamily: 'Arial', + lineHeight: 24 + }) + ); + graphics.push(group); + + const textLabel = createText({ + x: 1160, + y: 756, + text: 'text background', + fontSize: 18, + fill: '#17324d', + textBaseline: 'top', + fontFamily: 'Arial', + background: { + background: demoImage, + x: 1146, + y: 742, + width: 280, + height: 92 + }, + backgroundMode: 'no-repeat-cover', + backgroundPosition: 'center', + backgroundClip: true + }); + graphics.push(textLabel); + graphics.push(createHint('text 节点使用包装 background 配置,验证 x/y/width/height 与 cover + center', 1160, 792)); + + graphics.forEach(graphic => { + stage.defaultLayer.add(graphic); + }); +}; diff --git a/packages/vrender/__tests__/browser/src/pages/image.ts b/packages/vrender/__tests__/browser/src/pages/image.ts index df2466a4d..514ab2d0a 100644 --- a/packages/vrender/__tests__/browser/src/pages/image.ts +++ b/packages/vrender/__tests__/browser/src/pages/image.ts @@ -1,72 +1,187 @@ -import { createStage, createImage } from '@visactor/vrender'; -import { addShapesToStage, colorPools } from '../utils'; +import { createStage, createImage, createRect, createText } from '@visactor/vrender'; +import { addShapesToStage } from '../utils'; -const urlPng = 'https://vega.github.io/images/idl-logo.png'; const svg = ''; const svg1 = ''; const base64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE4AAABOCAYAAACOqiAdAAAAAXNSR0IArs4c6QAACbFJREFUeAHtXGlsVUUUPl1kbUsAUWRRrCAoSo0FBDSmqSQawV8gxF0Bo4kaXDCQ+MMY/7gUlKg/jKBGXILiD6MkQoD0hyBCa0BFgUBZhIpAQSlQwC5+3/Pel7vMzLuv7Zv7Xu1Jzrv3zsydOed7M3e2cyZPYqK2trYSFD0ePAY82uEhuBZ7GLfS6OF63O9yeCeuNXl5eadwtU55tkoEUAUoqwI8FVwJLgczrCPUgpdrwRvA68DVAJJhuU8ArAxcBf4DnGliGSyrLGeRg/DTwd+D4yKWPT1nAISwM8Db4kJLUS5lmZG1AEK4MeD1CsGzJWgdZewsADvcOUCYHhDmRfACMO8j059Nf8v2Ewdl/+ljcuB0g/x+pkFO/dMkZ5rPy9nmC4l8+hT2kL6FPaXkot4yvO9AuaJooIwoGiRlAy6XS3v3i1yWk5CZVoFfQifyXwHp5uCk7xBwAK0U+awEc1iRklrbWqW2Yb+sr98hNQ11AOpEyndMCYb3HSDjB5bKbUPGSvnAEZKfl29K7o2rwcMsgLfPG5jOfbuBA2j8biwHp/zbWbO+2L9F1hz+SY6ey8yw65JeJXL70HFy94iJUWvi35B9LsD7Mh3A3LTtAg6gLUQGr7iZ6K5seh/t+U5WH9omLahtNqgwr0DuHFYmD468JdG0I5S5EOC9FiGdL0lawAEwpl8MfsaXS+DhLL5R7+2ulpX7NlsDLCCCFKDZzr5ykjx6dYX0wTcyBb2B+OcAYFuKdMnoyMA5oH2ANx9Kvq24qT7ym1T9slqOneNMKX4a1KtYFlw3TSoGX5NKmA+RYE5U8NIBbgky1ta0Cy3NsvTXNbLqwJZUAsYSP/OKiTL/2tulR0Ghqfw3ANyzpgRuXCTgUn3T+PF/futnsuvUH26+WXkdXXKZvD7hnlSdxyKA92oqBVICB9DYe67SZVTXeFTm/7AiY72lrtz2hrP3XXrTA1JafIkpi5kAz9jbGoEDaByn/QhWDjl2nDwkT2/5ODFoNUmRbXEcTL858X4Z23+YTjQOVW4EeHW6BNoRI0DjLICDWyVorGm5CBqB4OyEslMHDVHnlQ4GyiRa4JD6RbByRsBvGpsnBchVouzUgbpoiLoTAyUpmyqQ5mR4Ozg092TvOW/jsqzvCJTaKgLZYSy7eZ6ut+V8tgxNlqvNPtLVuHeQKgQa3+SQI9t7T5+GKR6oC3XSEDF4WxUXAg61jb1opSoxB7fZOk5TyRs1jDpRNw3d5mDiiw41VSTahhRlvlR44DRqVvVbGZ0RjCi6WEYWDw4WnXje03gEy0/HlXGdEcgZxucVT+mmZ9vRXG/wluMbRgO06YgMgcYXOPfM9DRq8qBR8vTYO7zyJe/f3PFtRoGjbtSRswsFcd9kOsD7xo0LNtUX3AjvlascnLBnms626NcWmwxxnSUXdaSuGvJhkwQOiLKmTVK9xKUhG8tC/BzoyF0R1sV3Rjh1pK4amuRglIhOAoenB1UvcJzD9TQbZALHRo2jjtTVMLZ7wMUhARyQ5MbwvW6g98qVWxu1jWWawGly9iC8smXinrpSZw3d52Albo2rQMJQd8Y9Ai532yJjU7XwjXP1pM7UXUHEqILhLnBT+RAkbqxkao8gWBafjU3VUo2jHNSZumsogZULXKUqEXejbJIJOFNcJmQ06J7AKh9tllZD5arCuYVnk4zfOItNlTobdC8nZqxxE8AhqyH2LB3d96QA6ZCpAzCBmk4ZUdNSd03vSqwmEDjapoWIO+y2qVXa5JyiZjW3tsg/YNtkwGC0FjiaJcRBqm+Z7drm6m3AQA8cbTniIFVzVYFpQzYDBgnghqqEMMzZVMk7LeyMYtgRV40zYDCETbVIpXVcy+IqkFS1UCVzZ4cZMCgmcMWqAmlqFQepZg9xNVUDBnrg4hJWVa6qFtr4U1WyOOUmgLMhQ+QyVCCpwiJnmKGEbKpK6xhaQsZB2dRUDRg0aoGj+WgcpGoecXUOBgz0wNFMIA5SNUtVmA3ZDBg0crOmHnx9UBAaKsexf7r28M+y+9QRnzgHYxqMEwMN1RM4+kaFtnZo3R0H1Tf9JeRsIAMGu/iNI3Ahokn8/50MGOxya1wII/oRxEU0O2X552GnsuX4XvlRvxqbURENGOwkcFvBXLPxrcnR+YJ+BDbX5HrmXyRVsJicOOiqJCCPjLpVVmHz5HXYFdsk6q5xQCFWNfnYnabjQa1KKDpf2KTHx1T6QHPLngnfBfow2CSD7rXEjN840ob/Lv5feqzYpGnDfOYZvqLpu2CTDLonsHKBW6cSim4+tJm1QUWFvaRfjz7aoob26a+N6+wI6kzdNZTAygWuGon8gycE0DfKVhM53XxOGs6f1sgqGTW4CRZKnTV+YcSomukTwKHN8oP3CQOCRN8oeqnYoM8Nhj3sIGwQdaXOGvrEwSq5Ic10K1SJ2bOYvj2qd9obtmLvRvnqoL+f4kbNW7+ulc3H9rQ327Teo66a3pT5JDHyGRZiv/B7RIYslriEPLv6bWs2JKNKBsu4/sPlQmtzYgx3+OzJtJRvb2LWtpUVT+qc5zajtk128w4CR8PCr91I75V2sp/WbfIGdbn7e0un6AwLqetdAE5tWOhE0No8RPTCo7lnVyXqRh01RFPWJGhMo/rqv6x6ma6L9MLrqkTdDO6ZIUxCwAHZLwGOckDMOSS98LoaUSeDW+YGBxOf2iHgnNgncFUa5NK4mE4VXYWoi8ZgmioSA2IRIiVwQHgnUlaFUiOA/p50XbQ1o1DJ0Flh1IG6GHxYqxwsQkX6elVvLIYm3K3ZCB7vDXfv6UD22Kb3c9afi8vi706ZY3K/rIGuNwM4ZctT1jiC47wwG7dKLzH6e9J10bAuz2yykigzZTf4rFJnHq+hBI1KaYFjJF6sw2Uu71VEf0/+a7nUbCkrZTb4qlJVHquxT6WzG2YEjomQAXvZRe4LwSv/NXrf5UKH4XoKGmoa1eNxGtTZSNpvXPAtfPOWIOyZYLj73H2YgYtE4ArgCPL74IcDUb5HeuF1H5/hg0TEAW8xgrU1j6/QjKH7wJYAeHwEgFl7RBBXOLg0lFVHBHkxBHgz8Lwc3M8brrqn9Xb3oVQeZABeKR55UoRykOxJmrjNsmPQZjvDraCYkZ4j96q63AAeZxg8LWEBmPeRiTUxVw/ei6xkqoQAMNuPeuQxlGNS6RFbPITrPly0I+gDwO7jbDsIIA8CWAy2dYAyy8r4tn+HO4eooEKZAqStAE8FV4LLwQzrCHE/uBbMFWvusFs7stsacFDKRwCSthX0XKQTnstDcF/sYdxqD4mnXd9WDCloNGSd/gUj0iBbjpGP7QAAAABJRU5ErkJggg=='; -// const urlSvg = 'https://replace-with-svg-link.svg'; - const dogImage = 'https://lf9-dp-fe-cms-tos.byteorg.com/obj/bit-cloud/vrender/lovely_dog.jpg'; +const layoutImage = ` + + + + + + + + + + + + Image Layout +`; -export const page = () => { - const shapes = []; +const createLabel = (text: string, x: number, y: number, fontSize = 16, fill = '#17324d') => + createText({ + x, + y, + text, + fontSize, + fill, + textBaseline: 'top', + fontFamily: 'Arial' + }); - shapes.push( - createImage({ - x: 10, - y: 10, - image: dogImage, - clipConfig: { - shape: 'rectRound' - } - }) - ); - shapes.push( - createImage({ - x: 10, - y: 300, - width: 100, - stroke: 'green', - cornerRadius: 20, - lineWidth: 10, - fillStrokeOrder: -1, - image: dogImage - }) - ); - shapes.push( +const createHint = (text: string, x: number, y: number) => + createText({ + x, + y, + text, + fontSize: 13, + fill: '#61758a', + textBaseline: 'top', + fontFamily: 'Arial' + }); + +const createLayoutCard = ( + title: string, + description: string, + x: number, + y: number, + imageMode: 'cover' | 'contain' | 'fill' | 'auto' +) => { + const width = 320; + const height = 220; + const frameX = x + 18; + const frameY = y + 42; + const frameWidth = width - 36; + const frameHeight = 140; + + return [ + createRect({ + x, + y, + width, + height, + fill: '#f7f3eb', + stroke: '#d5c7b8', + lineWidth: 1, + cornerRadius: 16 + }), + createLabel(title, x + 18, y + 14), + createHint(description, x + 18, y + 182), + createRect({ + x: frameX, + y: frameY, + width: frameWidth, + height: frameHeight, + fill: '#fff8ef', + stroke: '#102a43', + lineWidth: 1, + cornerRadius: 14 + }), createImage({ - x: 200, - y: 300, - width: 100, - height: 100, - image: dogImage, - stroke: 'pink', - fillStrokeOrder: -1, - lineWidth: 10 + x: frameX, + y: frameY, + width: frameWidth, + height: frameHeight, + image: layoutImage, + imageMode, + imagePosition: 'center', + cornerRadius: 14 }) - ); + ]; +}; + +export const page = () => { + const shapes = []; - shapes.forEach(g => { - g.addEventListener('click', () => { - console.log('click', g._uid); - }); + shapes.push(createLabel('Image Primitive Demo', 48, 28, 28)); + shapes.push(createHint('basic image loading + sizing modes (cover / contain / fill / auto)', 48, 66)); + + const dogRounded = createImage({ + x: 48, + y: 112, + image: dogImage, + clipConfig: { + shape: 'rectRound' + } + }); + const dogStroke = createImage({ + x: 248, + y: 112, + width: 120, + stroke: '#2563eb', + cornerRadius: 24, + lineWidth: 8, + fillStrokeOrder: -1, + image: dogImage + }); + const dogSquare = createImage({ + x: 420, + y: 112, + width: 120, + height: 120, + image: dogImage, + stroke: '#f43f5e', + fillStrokeOrder: -1, + lineWidth: 8 + }); + const tinySvg = createImage({ + x: 592, + y: 112, + width: 120, + height: 120, + image: svg }); + const base64Image = createImage({ + x: 764, + y: 112, + width: 120, + height: 120, + image: base64 + }); + + shapes.push(dogRounded, dogStroke, dogSquare, tinySvg, base64Image); + shapes.push(createHint('clipConfig', 48, 238)); + shapes.push(createHint('stroke + radius', 248, 238)); + shapes.push(createHint('fixed width/height', 420, 238)); + shapes.push(createHint('inline svg', 592, 238)); + shapes.push(createHint('base64 image', 764, 238)); + + const cards = [ + createLayoutCard('cover', '等比缩放裁剪', 48, 300, 'cover'), + createLayoutCard('contain', '等比缩放留白', 404, 300, 'contain'), + createLayoutCard('fill', '拉伸适配设置大小', 760, 300, 'fill'), + createLayoutCard('auto', '保留原始尺寸', 1116, 300, 'auto') + ]; + cards.forEach(card => shapes.push(...card)); + + shapes.push(createLabel('Same API on image primitive', 48, 560, 22)); + shapes.push( + createHint("set `imageMode` to 'cover' | 'contain' | 'fill' | 'auto' after width/height is specified", 48, 592) + ); const stage = createStage({ canvas: 'main', - width: 1200, - height: 600, - viewWidth: 1200, - viewHeight: 600 + width: 1600, + height: 900, + viewWidth: 1600, + viewHeight: 900 }); + addShapesToStage(stage, shapes as any, false); stage.render(); - shapes.forEach(shape => { - stage.defaultLayer.add(shape); - }); + window.updateImage1 = () => { + tinySvg.setAttribute('image', svg1); + stage.render(); + }; + + window.updateImage0 = () => { + tinySvg.setAttribute('image', svg); + stage.render(); + }; }; diff --git a/packages/vrender/__tests__/browser/src/pages/index.ts b/packages/vrender/__tests__/browser/src/pages/index.ts index 2a7ed832d..51a110194 100644 --- a/packages/vrender/__tests__/browser/src/pages/index.ts +++ b/packages/vrender/__tests__/browser/src/pages/index.ts @@ -83,6 +83,10 @@ export const pages = [ name: 'rect绘制', path: 'rect' }, + { + name: 'background布局', + path: 'background' + }, { name: 'path绘制', path: 'path' diff --git a/packages/vrender/jest.config.js b/packages/vrender/jest.config.js index 816900eca..b6b59836f 100644 --- a/packages/vrender/jest.config.js +++ b/packages/vrender/jest.config.js @@ -4,11 +4,13 @@ module.exports = { runner: 'jest-electron/runner', testEnvironment: 'jest-electron/environment', testTimeout: 30000, + maxWorkers: 1, testRegex: '/__tests__/.*test\\.ts?$', moduleFileExtensions: ['ts', 'js', 'json'], setupFilesAfterEnv: ['jest-extended/all'], preset: 'ts-jest', silent: true, + useStderr: false, globals: { 'ts-jest': { resolveJsonModule: true, diff --git a/packages/vrender/package.json b/packages/vrender/package.json index efc3b3b26..329aa6c82 100644 --- a/packages/vrender/package.json +++ b/packages/vrender/package.json @@ -18,7 +18,7 @@ "build-umd": "cross-env DEBUG='Bundler*' bundle --clean -f umd", "dev": "cross-env DEBUG='Bundler*' bundle --clean -f es -w", "start": "vite ./__tests__/browser --host", - "test": "jest", + "test": "jest 2>&1", "test-cov": "jest -w 16 --coverage", "test-live": "npm run test-watch __tests__/unit/theme/line.test.ts", "test-watch": "cross-env DEBUG_MODE=1 jest --watch" diff --git a/rush.json b/rush.json index 82285353f..42b576216 100644 --- a/rush.json +++ b/rush.json @@ -2,7 +2,7 @@ "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/rush.schema.json", "rushVersion": "5.148.0", "pnpmVersion": "10.7.0", - "nodeSupportedVersionRange": ">=14.15.0 <15.0.0 || >=16.13.0 <17.0.0 || >=18.15.0 <19.0.0 || >=20.0.0 <21.0.0", + "nodeSupportedVersionRange": ">=18.18.0 <19.0.0 || >=20.0.0 <25.0.0", "suppressNodeLtsWarning": true, "ensureConsistentVersions": true, "projectFolderMinDepth": 1, diff --git a/share/jest-config/jest-environment-jsdom-26.js b/share/jest-config/jest-environment-jsdom-26.js new file mode 100644 index 000000000..35915b62f --- /dev/null +++ b/share/jest-config/jest-environment-jsdom-26.js @@ -0,0 +1,19 @@ +const fs = require('fs'); +const path = require('path'); + +function resolveJestEnvironmentJsdom26() { + const pnpmDir = path.resolve(__dirname, '../../common/temp/node_modules/.pnpm'); + const entry = fs + .readdirSync(pnpmDir) + .find(name => name.startsWith('jest-environment-jsdom@26.6.2')); + + if (!entry) { + throw new Error('Unable to resolve jest-environment-jsdom@26.6.2 from common/temp/node_modules/.pnpm'); + } + + return path.join(pnpmDir, entry, 'node_modules/jest-environment-jsdom/build/index.js'); +} + +const environmentModule = require(resolveJestEnvironmentJsdom26()); + +module.exports = environmentModule.default || environmentModule; diff --git a/share/jest-config/setup-jsdom-canvas.js b/share/jest-config/setup-jsdom-canvas.js new file mode 100644 index 000000000..d57ded647 --- /dev/null +++ b/share/jest-config/setup-jsdom-canvas.js @@ -0,0 +1,286 @@ +const path = require('path'); + +function loadCanvasModule() { + const repoRoot = path.resolve(__dirname, '../..'); + const lookupRoots = [ + path.resolve(repoRoot, 'packages/vrender-kits'), + path.resolve(repoRoot, 'packages/vrender'), + path.resolve(repoRoot, 'packages/vrender-core') + ]; + const errors = []; + + for (const root of lookupRoots) { + try { + const resolved = require.resolve('canvas', { paths: [root] }); + return require(resolved); + } catch (error) { + errors.push(`${root}: ${error.message}`); + } + } + + throw new Error( + [ + 'Failed to load the `canvas` package for Jest jsdom tests.', + 'Reinstall dependencies with the current Node.js version before running tests.', + ...errors + ].join('\n') + ); +} + +const canvasModule = loadCanvasModule(); +const { createCanvas, Image, ImageData, DOMMatrix, DOMPoint } = canvasModule; +const backingCanvasKey = Symbol.for('vrender.jsdom.backingCanvas'); +const measureCanvas = createCanvas(1, 1); +const measureContext = measureCanvas.getContext('2d'); + +function parsePixels(value, fallback = NaN) { + if (typeof value === 'number') { + return value; + } + if (typeof value !== 'string' || value.trim() === '') { + return fallback; + } + const parsed = Number.parseFloat(value); + return Number.isFinite(parsed) ? parsed : fallback; +} + +function getFontSize(style) { + return parsePixels(style?.fontSize, 16); +} + +function getLineHeight(style) { + return parsePixels(style?.lineHeight, getFontSize(style)); +} + +function getFont(style) { + const fontStyle = style?.fontStyle || 'normal'; + const fontWeight = style?.fontWeight || 'normal'; + const fontSize = getFontSize(style); + const fontFamily = style?.fontFamily || 'sans-serif'; + return `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`; +} + +function measureElementText(element) { + if (!measureContext) { + return { width: 0, height: 0 }; + } + + const text = (element.textContent || element.innerText || '').replace(/\u00a0/g, ' '); + if (!text) { + return { width: 0, height: getLineHeight(element.style) }; + } + + measureContext.font = getFont(element.style); + return { + width: measureContext.measureText(text).width, + height: getLineHeight(element.style) + }; +} + +function getElementWidth(element) { + if (element.tagName === 'CANVAS') { + return parsePixels(element.style?.width, element.width || 0); + } + + const explicitWidth = parsePixels(element.style?.width, NaN); + if (Number.isFinite(explicitWidth)) { + return explicitWidth; + } + + return measureElementText(element).width; +} + +function getElementHeight(element) { + if (element.tagName === 'CANVAS') { + return parsePixels(element.style?.height, element.height || 0); + } + + const explicitHeight = parsePixels(element.style?.height, NaN); + if (Number.isFinite(explicitHeight)) { + return explicitHeight; + } + + return measureElementText(element).height; +} + +function createRect(element) { + const width = getElementWidth(element); + const height = getElementHeight(element); + const left = parsePixels(element.style?.left, 0); + const top = parsePixels(element.style?.top, 0); + + return { + x: left, + y: top, + left, + top, + width, + height, + right: left + width, + bottom: top + height, + toJSON() { + return this; + } + }; +} + +function getBackingCanvas(canvasElement) { + let backingCanvas = canvasElement[backingCanvasKey]; + const width = canvasElement.width || 300; + const height = canvasElement.height || 150; + + if (!backingCanvas) { + backingCanvas = createCanvas(width, height); + canvasElement[backingCanvasKey] = backingCanvas; + } + + if (backingCanvas.width !== width) { + backingCanvas.width = width; + } + if (backingCanvas.height !== height) { + backingCanvas.height = height; + } + + return backingCanvas; +} + +if (typeof window !== 'undefined') { + Object.defineProperty(window, 'devicePixelRatio', { + configurable: true, + value: 1 + }); + + if (!window.matchMedia) { + window.matchMedia = query => ({ + matches: false, + media: query, + onchange: null, + addListener() {}, + removeListener() {}, + addEventListener() {}, + removeEventListener() {}, + dispatchEvent() { + return false; + } + }); + } + + if (!window.requestAnimationFrame) { + window.requestAnimationFrame = callback => setTimeout(() => callback(Date.now()), 16); + } + + if (!window.cancelAnimationFrame) { + window.cancelAnimationFrame = handle => clearTimeout(handle); + } + + if (!window.URL.createObjectURL) { + window.URL.createObjectURL = () => 'blob:vrender-jest'; + } + + if (!window.URL.revokeObjectURL) { + window.URL.revokeObjectURL = () => {}; + } + + if (!window.PointerEvent && window.MouseEvent) { + window.PointerEvent = window.MouseEvent; + } + + if (!window.OffscreenCanvas) { + window.OffscreenCanvas = class OffscreenCanvas { + constructor(width, height) { + return createCanvas(width, height); + } + }; + } + + if (window.HTMLElement) { + Object.defineProperty(window.HTMLElement.prototype, 'offsetWidth', { + configurable: true, + get() { + return getElementWidth(this); + } + }); + + Object.defineProperty(window.HTMLElement.prototype, 'offsetHeight', { + configurable: true, + get() { + return getElementHeight(this); + } + }); + + Object.defineProperty(window.HTMLElement.prototype, 'clientWidth', { + configurable: true, + get() { + return getElementWidth(this); + } + }); + + Object.defineProperty(window.HTMLElement.prototype, 'clientHeight', { + configurable: true, + get() { + return getElementHeight(this); + } + }); + + Object.defineProperty(window.HTMLElement.prototype, 'offsetLeft', { + configurable: true, + get() { + return parsePixels(this.style?.left, 0); + } + }); + + Object.defineProperty(window.HTMLElement.prototype, 'offsetTop', { + configurable: true, + get() { + return parsePixels(this.style?.top, 0); + } + }); + + Object.defineProperty(window.HTMLElement.prototype, 'getBoundingClientRect', { + configurable: true, + value() { + return createRect(this); + } + }); + } + + if (window.HTMLCanvasElement) { + Object.defineProperty(window.HTMLCanvasElement.prototype, 'getContext', { + configurable: true, + value(type, options) { + return getBackingCanvas(this).getContext(type, options); + } + }); + + Object.defineProperty(window.HTMLCanvasElement.prototype, 'toDataURL', { + configurable: true, + value(...args) { + return getBackingCanvas(this).toDataURL(...args); + } + }); + + Object.defineProperty(window.HTMLCanvasElement.prototype, 'toBuffer', { + configurable: true, + value(...args) { + return getBackingCanvas(this).toBuffer(...args); + } + }); + } +} + +global.Image = Image; +global.ImageData = ImageData; +global.DOMMatrix = DOMMatrix; +global.DOMPoint = DOMPoint; + +if (typeof window !== 'undefined') { + window.Image = Image; + window.ImageData = ImageData; + window.DOMMatrix = DOMMatrix; + window.DOMPoint = DOMPoint; +} + +global.requestAnimationFrame = window.requestAnimationFrame.bind(window); +global.cancelAnimationFrame = window.cancelAnimationFrame.bind(window); +global.PointerEvent = window.PointerEvent; +global.OffscreenCanvas = window.OffscreenCanvas;