diff --git a/.vscode/settings.json b/.vscode/settings.json index 8914035..6ac5e03 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,10 +1,5 @@ { + "typescript.tsdk": "node_modules/typescript/lib", "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.detectIndentation": false, - "editor.formatOnSave": true, - "editor.formatOnType": true, - "editor.codeActionsOnSave": { - "source.fixAll": "explicit" - }, - "typescript.tsdk": "node_modules/typescript/lib" + "editor.formatOnSave": true } diff --git a/dev/Readonly.tsx b/dev/Readonly.tsx index 44eb607..96cad35 100644 --- a/dev/Readonly.tsx +++ b/dev/Readonly.tsx @@ -17,11 +17,14 @@ export const Component: React.FC = () => {
renderCount: {renderCount}
shallowReadonlyObject = {JSON.stringify(shallowReadonlyObject, null, 2)}
+ {/* @ts-ignore */}
readonlyObject = {JSON.stringify(readonlyObject, null, 2)}
+ {/* @ts-ignore */} + {/* @ts-ignore */}
) diff --git a/package.json b/package.json index b4e4d71..c6b370c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "veact", - "version": "1.0.0-beta.2", + "version": "1.0.0", "description": "Mutable state enhancer library for React by @vue/reactivity", "keywords": [ "React", @@ -50,7 +50,7 @@ "react-dom": "^16.8.0 || ^17 || ^18 || ^19" }, "dependencies": { - "@vue/reactivity": "^3.5.0-beta.2" + "@vue/reactivity": ">=3.5" }, "devDependencies": { "@eslint/js": "^9.x", @@ -64,14 +64,14 @@ "eslint-config-prettier": "^9.x", "eslint-plugin-prettier": "^5.x", "globals": "^15.9.0", - "jsdom": "^24.x", + "happy-dom": "^15.x", "prettier": "^3.x", "react": "^18.x", "react-dom": "^18.x", "typescript": "^5.5.4", "typescript-eslint": "^8.x", "vite": "^5.x", - "vite-plugin-dts": "^4.0.3", + "vite-plugin-dts": "^4.1.0", "vitest": "^2.x" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 709dba0..5d20d2b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,45 +9,45 @@ importers: .: dependencies: '@vue/reactivity': - specifier: ^3.5.0-beta.2 - version: 3.5.0-beta.2 + specifier: '>=3.5' + version: 3.5.2 devDependencies: '@eslint/js': specifier: ^9.x - version: 9.9.0 + version: 9.9.1 '@testing-library/react': specifier: ^16.x - version: 16.0.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/eslint': specifier: ^9.x - version: 9.6.0 + version: 9.6.1 '@types/react': specifier: ^18.x - version: 18.3.3 + version: 18.3.5 '@types/react-dom': specifier: ^18.x version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.x - version: 4.3.1(vite@5.4.0) + version: 4.3.1(vite@5.4.3) '@vitest/coverage-v8': specifier: ^2.0.5 - version: 2.0.5(vitest@2.0.5(jsdom@24.1.1)) + version: 2.0.5(vitest@2.0.5(happy-dom@15.7.3)) eslint: specifier: ^9.x - version: 9.9.0 + version: 9.9.1 eslint-config-prettier: specifier: ^9.x - version: 9.1.0(eslint@9.9.0) + version: 9.1.0(eslint@9.9.1) eslint-plugin-prettier: specifier: ^5.x - version: 5.2.1(@types/eslint@9.6.0)(eslint-config-prettier@9.1.0(eslint@9.9.0))(eslint@9.9.0)(prettier@3.3.3) + version: 5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.9.1))(eslint@9.9.1)(prettier@3.3.3) globals: specifier: ^15.9.0 version: 15.9.0 - jsdom: - specifier: ^24.x - version: 24.1.1 + happy-dom: + specifier: ^15.x + version: 15.7.3 prettier: specifier: ^3.x version: 3.3.3 @@ -62,16 +62,16 @@ importers: version: 5.5.4 typescript-eslint: specifier: ^8.x - version: 8.1.0(eslint@9.9.0)(typescript@5.5.4) + version: 8.4.0(eslint@9.9.1)(typescript@5.5.4) vite: specifier: ^5.x - version: 5.4.0 + version: 5.4.3 vite-plugin-dts: - specifier: ^4.0.3 - version: 4.0.3(rollup@4.20.0)(typescript@5.5.4)(vite@5.4.0) + specifier: ^4.1.0 + version: 4.1.0(rollup@4.21.2)(typescript@5.5.4)(vite@5.4.3) vitest: specifier: ^2.x - version: 2.0.5(jsdom@24.1.1) + version: 2.0.5(happy-dom@15.7.3) packages: @@ -83,16 +83,16 @@ packages: resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.25.2': - resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} + '@babel/compat-data@7.25.4': + resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} engines: {node: '>=6.9.0'} '@babel/core@7.25.2': resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.25.0': - resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} + '@babel/generator@7.25.6': + resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.25.2': @@ -129,16 +129,16 @@ packages: resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.25.0': - resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} + '@babel/helpers@7.25.6': + resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} engines: {node: '>=6.9.0'} '@babel/highlight@7.24.7': resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.25.3': - resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} + '@babel/parser@7.25.6': + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} engines: {node: '>=6.0.0'} hasBin: true @@ -154,20 +154,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.25.0': - resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} + '@babel/runtime@7.25.6': + resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} engines: {node: '>=6.9.0'} '@babel/template@7.25.0': resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.3': - resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} + '@babel/traverse@7.25.6': + resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.25.2': - resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} + '@babel/types@7.25.6': + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -321,16 +321,16 @@ packages: resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.17.1': - resolution: {integrity: sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==} + '@eslint/config-array@0.18.0': + resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.1.0': resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.9.0': - resolution: {integrity: sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==} + '@eslint/js@9.9.1': + resolution: {integrity: sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.4': @@ -413,83 +413,83 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.20.0': - resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==} + '@rollup/rollup-android-arm-eabi@4.21.2': + resolution: {integrity: sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.20.0': - resolution: {integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==} + '@rollup/rollup-android-arm64@4.21.2': + resolution: {integrity: sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.20.0': - resolution: {integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==} + '@rollup/rollup-darwin-arm64@4.21.2': + resolution: {integrity: sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.20.0': - resolution: {integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==} + '@rollup/rollup-darwin-x64@4.21.2': + resolution: {integrity: sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.20.0': - resolution: {integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==} + '@rollup/rollup-linux-arm-gnueabihf@4.21.2': + resolution: {integrity: sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.20.0': - resolution: {integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==} + '@rollup/rollup-linux-arm-musleabihf@4.21.2': + resolution: {integrity: sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.20.0': - resolution: {integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==} + '@rollup/rollup-linux-arm64-gnu@4.21.2': + resolution: {integrity: sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.20.0': - resolution: {integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==} + '@rollup/rollup-linux-arm64-musl@4.21.2': + resolution: {integrity: sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': - resolution: {integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': + resolution: {integrity: sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.20.0': - resolution: {integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==} + '@rollup/rollup-linux-riscv64-gnu@4.21.2': + resolution: {integrity: sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.20.0': - resolution: {integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==} + '@rollup/rollup-linux-s390x-gnu@4.21.2': + resolution: {integrity: sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.20.0': - resolution: {integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==} + '@rollup/rollup-linux-x64-gnu@4.21.2': + resolution: {integrity: sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.20.0': - resolution: {integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==} + '@rollup/rollup-linux-x64-musl@4.21.2': + resolution: {integrity: sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.20.0': - resolution: {integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==} + '@rollup/rollup-win32-arm64-msvc@4.21.2': + resolution: {integrity: sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.20.0': - resolution: {integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==} + '@rollup/rollup-win32-ia32-msvc@4.21.2': + resolution: {integrity: sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.20.0': - resolution: {integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==} + '@rollup/rollup-win32-x64-msvc@4.21.2': + resolution: {integrity: sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==} cpu: [x64] os: [win32] @@ -519,8 +519,8 @@ packages: resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} - '@testing-library/react@16.0.0': - resolution: {integrity: sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==} + '@testing-library/react@16.0.1': + resolution: {integrity: sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==} engines: {node: '>=18'} peerDependencies: '@testing-library/dom': ^10.0.0 @@ -552,8 +552,8 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - '@types/eslint@9.6.0': - resolution: {integrity: sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==} + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} @@ -567,11 +567,11 @@ packages: '@types/react-dom@18.3.0': resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - '@types/react@18.3.3': - resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + '@types/react@18.3.5': + resolution: {integrity: sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==} - '@typescript-eslint/eslint-plugin@8.1.0': - resolution: {integrity: sha512-LlNBaHFCEBPHyD4pZXb35mzjGkuGKXU5eeCA1SxvHfiRES0E82dOounfVpL4DCqYvJEKab0bZIA0gCRpdLKkCw==} + '@typescript-eslint/eslint-plugin@8.4.0': + resolution: {integrity: sha512-rg8LGdv7ri3oAlenMACk9e+AR4wUV0yrrG+XKsGKOK0EVgeEDqurkXMPILG2836fW4ibokTB5v4b6Z9+GYQDEw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -581,8 +581,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.1.0': - resolution: {integrity: sha512-U7iTAtGgJk6DPX9wIWPPOlt1gO57097G06gIcl0N0EEnNw8RGD62c+2/DiP/zL7KrkqnnqF7gtFGR7YgzPllTA==} + '@typescript-eslint/parser@8.4.0': + resolution: {integrity: sha512-NHgWmKSgJk5K9N16GIhQ4jSobBoJwrmURaLErad0qlLjrpP5bECYg+wxVTGlGZmJbU03jj/dfnb6V9bw+5icsA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -591,12 +591,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@8.1.0': - resolution: {integrity: sha512-DsuOZQji687sQUjm4N6c9xABJa7fjvfIdjqpSIIVOgaENf2jFXiM9hIBZOL3hb6DHK9Nvd2d7zZnoMLf9e0OtQ==} + '@typescript-eslint/scope-manager@8.4.0': + resolution: {integrity: sha512-n2jFxLeY0JmKfUqy3P70rs6vdoPjHK8P/w+zJcV3fk0b0BwRXC/zxRTEnAsgYT7MwdQDt/ZEbtdzdVC+hcpF0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.1.0': - resolution: {integrity: sha512-oLYvTxljVvsMnldfl6jIKxTaU7ok7km0KDrwOt1RHYu6nxlhN3TIx8k5Q52L6wR33nOwDgM7VwW1fT1qMNfFIA==} + '@typescript-eslint/type-utils@8.4.0': + resolution: {integrity: sha512-pu2PAmNrl9KX6TtirVOrbLPLwDmASpZhK/XU7WvoKoCUkdtq9zF7qQ7gna0GBZFN0hci0vHaSusiL2WpsQk37A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -604,12 +604,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@8.1.0': - resolution: {integrity: sha512-q2/Bxa0gMOu/2/AKALI0tCKbG2zppccnRIRCW6BaaTlRVaPKft4oVYPp7WOPpcnsgbr0qROAVCVKCvIQ0tbWog==} + '@typescript-eslint/types@8.4.0': + resolution: {integrity: sha512-T1RB3KQdskh9t3v/qv7niK6P8yvn7ja1mS7QK7XfRVL6wtZ8/mFs/FHf4fKvTA0rKnqnYxl/uHFNbnEt0phgbw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.1.0': - resolution: {integrity: sha512-NTHhmufocEkMiAord/g++gWKb0Fr34e9AExBRdqgWdVBaKoei2dIyYKD9Q0jBnvfbEA5zaf8plUFMUH6kQ0vGg==} + '@typescript-eslint/typescript-estree@8.4.0': + resolution: {integrity: sha512-kJ2OIP4dQw5gdI4uXsaxUZHRwWAGpREJ9Zq6D5L0BweyOrWsL6Sz0YcAZGWhvKnH7fm1J5YFE1JrQL0c9dd53A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -617,14 +617,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.1.0': - resolution: {integrity: sha512-ypRueFNKTIFwqPeJBfeIpxZ895PQhNyH4YID6js0UoBImWYoSjBsahUn9KMiJXh94uOjVBgHD9AmkyPsPnFwJA==} + '@typescript-eslint/utils@8.4.0': + resolution: {integrity: sha512-swULW8n1IKLjRAgciCkTCafyTHHfwVQFt8DovmaF69sKbOxTSFMmIZaSHjqO9i/RV0wIblaawhzvtva8Nmm7lQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@8.1.0': - resolution: {integrity: sha512-ba0lNI19awqZ5ZNKh6wCModMwoZs457StTebQ0q1NP58zSi2F6MOZRXwfKZy+jB78JNJ/WH8GSh2IQNzXX8Nag==} + '@typescript-eslint/visitor-keys@8.4.0': + resolution: {integrity: sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitejs/plugin-react@4.3.1': @@ -656,29 +656,20 @@ packages: '@vitest/utils@2.0.5': resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} - '@volar/language-core@2.3.4': - resolution: {integrity: sha512-wXBhY11qG6pCDAqDnbBRFIDSIwbqkWI7no+lj5+L7IlA7HRIjRP7YQLGzT0LF4lS6eHkMSsclXqy9DwYJasZTQ==} - - '@volar/language-core@2.4.0-alpha.18': - resolution: {integrity: sha512-JAYeJvYQQROmVRtSBIczaPjP3DX4QW1fOqW1Ebs0d3Y3EwSNRglz03dSv0Dm61dzd0Yx3WgTW3hndDnTQqgmyg==} + '@volar/language-core@2.4.2': + resolution: {integrity: sha512-sONt5RLvLL1SlBdhyUSthZzuKePbJ7DwFFB9zT0eyWpDl+v7GXGh/RkPxxWaR22bIhYtTzp4Ka1MWatl/53Riw==} - '@volar/source-map@2.3.4': - resolution: {integrity: sha512-C+t63nwcblqLIVTYXaVi/+gC8NukDaDIQI72J3R7aXGvtgaVB16c+J8Iz7/VfOy7kjYv7lf5GhBny6ACw9fTGQ==} + '@volar/source-map@2.4.2': + resolution: {integrity: sha512-qiGfGgeZ5DEarPX3S+HcFktFCjfDrFPCXKeXNbrlB7v8cvtPRm8YVwoXOdGG1NhaL5rMlv5BZPVQyu4EdWWIvA==} - '@volar/source-map@2.4.0-alpha.18': - resolution: {integrity: sha512-MTeCV9MUwwsH0sNFiZwKtFrrVZUK6p8ioZs3xFzHc2cvDXHWlYN3bChdQtwKX+FY2HG6H3CfAu1pKijolzIQ8g==} + '@volar/typescript@2.4.2': + resolution: {integrity: sha512-m2uZduhaHO1SZuagi30OsjI/X1gwkaEAC+9wT/nCNAtJ5FqXEkKvUncHmffG7ESDZPlFFUBK4vJ0D9Hfr+f2EA==} - '@volar/typescript@2.3.4': - resolution: {integrity: sha512-acCvt7dZECyKcvO5geNybmrqOsu9u8n5XP1rfiYsOLYGPxvHRav9BVmEdRyZ3vvY6mNyQ1wLL5Hday4IShe17w==} + '@vue/compiler-core@3.5.2': + resolution: {integrity: sha512-1aP7FL2GkqfcskHWGg3lfWQpJnrmewKc+rNJ/hq9WNaAw4BEyJ5QbNChnqmbw+tJ409zdy1XWmUeXXMrCKJcQQ==} - '@volar/typescript@2.4.0-alpha.18': - resolution: {integrity: sha512-sXh5Y8sqGUkgxpMWUGvRXggxYHAVxg0Pa1C42lQZuPDrW6vHJPR0VCK8Sr7WJsAW530HuNQT/ZIskmXtxjybMQ==} - - '@vue/compiler-core@3.4.38': - resolution: {integrity: sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==} - - '@vue/compiler-dom@3.4.38': - resolution: {integrity: sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ==} + '@vue/compiler-dom@3.5.2': + resolution: {integrity: sha512-QY4DpT8ZIUyu/ZA5gErpSEDocGNEbHmpkZIC/d5jbp/rUF0iOJNigAy3HCCKc0PMMhDlrcysO3ufQ6Ab4MpEcQ==} '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} @@ -691,14 +682,11 @@ packages: typescript: optional: true - '@vue/reactivity@3.5.0-beta.2': - resolution: {integrity: sha512-/OMAO+vGHfPAPvofdW9lRJEBNBoLt6vpRYS4TMbbz+wMgQQ23vvOvp6W8s0pkcSsw0mm697Z3WDz1ZZhUW/NzA==} - - '@vue/shared@3.4.38': - resolution: {integrity: sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==} + '@vue/reactivity@3.5.2': + resolution: {integrity: sha512-lJwWL5bNht+2vIwU/+lnGdH+FKFxzz6z8WkoIJityPLiasWU+HDUvEsC7gm3JFwbTf7Kk+Nr9kJMaPy0HXwwxQ==} - '@vue/shared@3.5.0-beta.2': - resolution: {integrity: sha512-cexku/B2Ezno4tBTSfgNwaY+WUAF1rI3S3D9mOOYDn3gEpRn+HR5cLNW3bVC8yxoH4cNd4YMpbELuhMv67+/cw==} + '@vue/shared@3.5.2': + resolution: {integrity: sha512-Ce89WNFBzcDca/AgFTxgX4/K4iAyF7oFIp8Z5aBbFBNbtpwnQr+5pZOoHndxnjE2h+YFcipVMzs9UL11XB6dwA==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -710,10 +698,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} - ajv-draft-04@1.0.0: resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} peerDependencies: @@ -772,17 +756,10 @@ packages: aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -809,8 +786,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001651: - resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} + caniuse-lite@1.0.30001657: + resolution: {integrity: sha512-DPbJAlP8/BAXy3IgiWmZKItubb3TYGP0WscQQlVGIfT4s/YlFYVuJgyOsQNP7rJRChx/qdMeLJQJP0Sgg2yjNA==} chai@5.1.1: resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} @@ -841,10 +818,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - compare-versions@6.1.1: resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} @@ -864,17 +837,9 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} - cssstyle@4.0.1: - resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} - engines: {node: '>=18'} - csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} - de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} @@ -887,9 +852,6 @@ packages: supports-color: optional: true - decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -897,26 +859,18 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.7: - resolution: {integrity: sha512-6FTNWIWMxMy/ZY6799nBlPtF1DFDQ6VQJ7yyDP27SJNt5lwtQ5ufqVvHylb3fdQefvRcgA3fKcFMJi9OLwBRNw==} + electron-to-chromium@1.5.14: + resolution: {integrity: sha512-bEfPECb3fJ15eaDnu9LEJ2vPGD6W1vt7vZleSVyFhYuMIKm3vz/g9lt7IvEzgdwj58RjbPKUF2rXTCN/UW47tQ==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -933,8 +887,8 @@ packages: engines: {node: '>=12'} hasBin: true - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-string-regexp@1.0.5: @@ -977,8 +931,8 @@ packages: resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.9.0: - resolution: {integrity: sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA==} + eslint@9.9.1: + resolution: {integrity: sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1059,10 +1013,6 @@ packages: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -1110,16 +1060,16 @@ packages: resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} engines: {node: '>=18'} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + happy-dom@15.7.3: + resolution: {integrity: sha512-w3RUaYNXFJX5LiNVhOJLK4GqCB1bFj1FvELtpon3HrN8gUpS09V0Vvm4/BBRRj7mLUE1+ch8PKv1JxEp/0IHjA==} + engines: {node: '>=18.0.0'} + has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -1136,29 +1086,13 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} - html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - - https-proxy-agent@7.0.5: - resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} - engines: {node: '>= 14'} - human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -1175,8 +1109,8 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - is-core-module@2.15.0: - resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} is-extglob@2.1.1: @@ -1199,9 +1133,6 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1238,15 +1169,6 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsdom@24.1.1: - resolution: {integrity: sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==} - engines: {node: '>=18'} - peerDependencies: - canvas: ^2.11.2 - peerDependenciesMeta: - canvas: - optional: true - jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} @@ -1320,8 +1242,8 @@ packages: magic-string@0.30.11: resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} - magicast@0.3.4: - resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} @@ -1334,18 +1256,10 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} @@ -1388,9 +1302,6 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - nwsapi@2.2.12: - resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} - onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} @@ -1414,9 +1325,6 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -1439,10 +1347,6 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} @@ -1450,18 +1354,18 @@ packages: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - pkg-types@1.1.3: - resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==} + pkg-types@1.2.0: + resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==} - postcss@8.4.41: - resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + postcss@8.4.45: + resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -1481,16 +1385,10 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -1517,9 +1415,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -1532,27 +1427,14 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.20.0: - resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==} + rollup@4.21.2: + resolution: {integrity: sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rrweb-cssom@0.6.0: - resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} - - rrweb-cssom@0.7.1: - resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} @@ -1585,10 +1467,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -1650,9 +1528,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - synckit@0.9.1: resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} engines: {node: ^14.18.0 || >=16.0.0} @@ -1667,8 +1542,8 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinypool@1.0.0: - resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==} + tinypool@1.0.1: + resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} engines: {node: ^18.0.0 || >=20.0.0} tinyrainbow@1.2.0: @@ -1687,29 +1562,21 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} - - tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} - engines: {node: '>=18'} - ts-api-utils@1.3.0: resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' - tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typescript-eslint@8.1.0: - resolution: {integrity: sha512-prB2U3jXPJLpo1iVLN338Lvolh6OrcCZO+9Yv6AR+tvegPPptYCDBIHiEEUdqRi8gAv2bXNKfMUrgAd2ejn/ow==} + typescript-eslint@8.4.0: + resolution: {integrity: sha512-67qoc3zQZe3CAkO0ua17+7aCLI0dU+sSQd1eKPGq06QE4rfQjstVXR6woHO5qQvGUa550NfGckT4tzh3b3c8Pw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -1734,10 +1601,6 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - update-browserslist-db@1.1.0: resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} hasBin: true @@ -1747,16 +1610,13 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - vite-node@2.0.5: resolution: {integrity: sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite-plugin-dts@4.0.3: - resolution: {integrity: sha512-+xnTsaONwU2kV6zhRjtbRJSGN41uFR/whqmcb4k4fftLFDJElxthp0PP5Fq8gMeM9ytWMt1yk5gGgekLREWYQQ==} + vite-plugin-dts@4.1.0: + resolution: {integrity: sha512-sRlmt9k2q8MrX4F2058N3KmB6WyJ3Ao6QaExOv1X99F3j0GhPziEz1zscWQ1q2r1PeFc96L7GIUu8Pl2DPr2Hg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -1765,8 +1625,8 @@ packages: vite: optional: true - vite@5.4.0: - resolution: {integrity: sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==} + vite@5.4.3: + resolution: {integrity: sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -1830,25 +1690,13 @@ packages: peerDependencies: typescript: '>=5.0.0' - w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} - webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} - - whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} - - whatwg-url@14.0.0: - resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} - engines: {node: '>=18'} + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} @@ -1872,25 +1720,6 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -1911,22 +1740,22 @@ snapshots: '@babel/code-frame@7.24.7': dependencies: '@babel/highlight': 7.24.7 - picocolors: 1.0.1 + picocolors: 1.1.0 - '@babel/compat-data@7.25.2': {} + '@babel/compat-data@7.25.4': {} '@babel/core@7.25.2': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 + '@babel/generator': 7.25.6 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helpers': 7.25.0 - '@babel/parser': 7.25.3 + '@babel/helpers': 7.25.6 + '@babel/parser': 7.25.6 '@babel/template': 7.25.0 - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 convert-source-map: 2.0.0 debug: 4.3.6 gensync: 1.0.0-beta.2 @@ -1935,16 +1764,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.25.0': + '@babel/generator@7.25.6': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 '@babel/helper-compilation-targets@7.25.2': dependencies: - '@babel/compat-data': 7.25.2 + '@babel/compat-data': 7.25.4 '@babel/helper-validator-option': 7.24.8 browserslist: 4.23.3 lru-cache: 5.1.1 @@ -1952,8 +1781,8 @@ snapshots: '@babel/helper-module-imports@7.24.7': dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color @@ -1963,7 +1792,7 @@ snapshots: '@babel/helper-module-imports': 7.24.7 '@babel/helper-simple-access': 7.24.7 '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color @@ -1971,8 +1800,8 @@ snapshots: '@babel/helper-simple-access@7.24.7': dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color @@ -1982,21 +1811,21 @@ snapshots: '@babel/helper-validator-option@7.24.8': {} - '@babel/helpers@7.25.0': + '@babel/helpers@7.25.6': dependencies: '@babel/template': 7.25.0 - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 '@babel/highlight@7.24.7': dependencies: '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.1 + picocolors: 1.1.0 - '@babel/parser@7.25.3': + '@babel/parser@7.25.6': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.2)': dependencies: @@ -2008,29 +1837,29 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/runtime@7.25.0': + '@babel/runtime@7.25.6': dependencies: regenerator-runtime: 0.14.1 '@babel/template@7.25.0': dependencies: '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 - '@babel/traverse@7.25.3': + '@babel/traverse@7.25.6': dependencies: '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 - '@babel/parser': 7.25.3 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 '@babel/template': 7.25.0 - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 debug: 4.3.6 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.25.2': + '@babel/types@7.25.6': dependencies: '@babel/helper-string-parser': 7.24.8 '@babel/helper-validator-identifier': 7.24.7 @@ -2107,14 +1936,14 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.9.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@9.9.1)': dependencies: - eslint: 9.9.0 + eslint: 9.9.1 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.11.0': {} - '@eslint/config-array@0.17.1': + '@eslint/config-array@0.18.0': dependencies: '@eslint/object-schema': 2.1.4 debug: 4.3.6 @@ -2136,7 +1965,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.9.0': {} + '@eslint/js@9.9.1': {} '@eslint/object-schema@2.1.4': {} @@ -2224,60 +2053,60 @@ snapshots: '@pkgr/core@0.1.1': {} - '@rollup/pluginutils@5.1.0(rollup@4.20.0)': + '@rollup/pluginutils@5.1.0(rollup@4.21.2)': dependencies: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.20.0 + rollup: 4.21.2 - '@rollup/rollup-android-arm-eabi@4.20.0': + '@rollup/rollup-android-arm-eabi@4.21.2': optional: true - '@rollup/rollup-android-arm64@4.20.0': + '@rollup/rollup-android-arm64@4.21.2': optional: true - '@rollup/rollup-darwin-arm64@4.20.0': + '@rollup/rollup-darwin-arm64@4.21.2': optional: true - '@rollup/rollup-darwin-x64@4.20.0': + '@rollup/rollup-darwin-x64@4.21.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + '@rollup/rollup-linux-arm-gnueabihf@4.21.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.20.0': + '@rollup/rollup-linux-arm-musleabihf@4.21.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.20.0': + '@rollup/rollup-linux-arm64-gnu@4.21.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.20.0': + '@rollup/rollup-linux-arm64-musl@4.21.2': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.20.0': + '@rollup/rollup-linux-riscv64-gnu@4.21.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.20.0': + '@rollup/rollup-linux-s390x-gnu@4.21.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.20.0': + '@rollup/rollup-linux-x64-gnu@4.21.2': optional: true - '@rollup/rollup-linux-x64-musl@4.20.0': + '@rollup/rollup-linux-x64-musl@4.21.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.20.0': + '@rollup/rollup-win32-arm64-msvc@4.21.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.20.0': + '@rollup/rollup-win32-ia32-msvc@4.21.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.20.0': + '@rollup/rollup-win32-x64-msvc@4.21.2': optional: true '@rushstack/node-core-library@5.5.1': @@ -2313,7 +2142,7 @@ snapshots: '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.24.7 - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 @@ -2321,14 +2150,14 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/react@16.0.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 '@testing-library/dom': 10.4.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 '@types/argparse@1.0.38': {} @@ -2337,26 +2166,26 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 - '@types/eslint@9.6.0': + '@types/eslint@9.6.1': dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 @@ -2369,22 +2198,22 @@ snapshots: '@types/react-dom@18.3.0': dependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 - '@types/react@18.3.3': + '@types/react@18.3.5': dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 - '@typescript-eslint/eslint-plugin@8.1.0(@typescript-eslint/parser@8.1.0(eslint@9.9.0)(typescript@5.5.4))(eslint@9.9.0)(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1)(typescript@5.5.4))(eslint@9.9.1)(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 8.1.0(eslint@9.9.0)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 8.1.0 - '@typescript-eslint/type-utils': 8.1.0(eslint@9.9.0)(typescript@5.5.4) - '@typescript-eslint/utils': 8.1.0(eslint@9.9.0)(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 8.1.0 - eslint: 9.9.0 + '@typescript-eslint/parser': 8.4.0(eslint@9.9.1)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.4.0 + '@typescript-eslint/type-utils': 8.4.0(eslint@9.9.1)(typescript@5.5.4) + '@typescript-eslint/utils': 8.4.0(eslint@9.9.1)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.4.0 + eslint: 9.9.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -2394,28 +2223,28 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.1.0(eslint@9.9.0)(typescript@5.5.4)': + '@typescript-eslint/parser@8.4.0(eslint@9.9.1)(typescript@5.5.4)': dependencies: - '@typescript-eslint/scope-manager': 8.1.0 - '@typescript-eslint/types': 8.1.0 - '@typescript-eslint/typescript-estree': 8.1.0(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 8.1.0 + '@typescript-eslint/scope-manager': 8.4.0 + '@typescript-eslint/types': 8.4.0 + '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.4.0 debug: 4.3.6 - eslint: 9.9.0 + eslint: 9.9.1 optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.1.0': + '@typescript-eslint/scope-manager@8.4.0': dependencies: - '@typescript-eslint/types': 8.1.0 - '@typescript-eslint/visitor-keys': 8.1.0 + '@typescript-eslint/types': 8.4.0 + '@typescript-eslint/visitor-keys': 8.4.0 - '@typescript-eslint/type-utils@8.1.0(eslint@9.9.0)(typescript@5.5.4)': + '@typescript-eslint/type-utils@8.4.0(eslint@9.9.1)(typescript@5.5.4)': dependencies: - '@typescript-eslint/typescript-estree': 8.1.0(typescript@5.5.4) - '@typescript-eslint/utils': 8.1.0(eslint@9.9.0)(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.5.4) + '@typescript-eslint/utils': 8.4.0(eslint@9.9.1)(typescript@5.5.4) debug: 4.3.6 ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: @@ -2424,14 +2253,14 @@ snapshots: - eslint - supports-color - '@typescript-eslint/types@8.1.0': {} + '@typescript-eslint/types@8.4.0': {} - '@typescript-eslint/typescript-estree@8.1.0(typescript@5.5.4)': + '@typescript-eslint/typescript-estree@8.4.0(typescript@5.5.4)': dependencies: - '@typescript-eslint/types': 8.1.0 - '@typescript-eslint/visitor-keys': 8.1.0 + '@typescript-eslint/types': 8.4.0 + '@typescript-eslint/visitor-keys': 8.4.0 debug: 4.3.6 - globby: 11.1.0 + fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 @@ -2441,34 +2270,34 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.1.0(eslint@9.9.0)(typescript@5.5.4)': + '@typescript-eslint/utils@8.4.0(eslint@9.9.1)(typescript@5.5.4)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.0) - '@typescript-eslint/scope-manager': 8.1.0 - '@typescript-eslint/types': 8.1.0 - '@typescript-eslint/typescript-estree': 8.1.0(typescript@5.5.4) - eslint: 9.9.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1) + '@typescript-eslint/scope-manager': 8.4.0 + '@typescript-eslint/types': 8.4.0 + '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.5.4) + eslint: 9.9.1 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@8.1.0': + '@typescript-eslint/visitor-keys@8.4.0': dependencies: - '@typescript-eslint/types': 8.1.0 + '@typescript-eslint/types': 8.4.0 eslint-visitor-keys: 3.4.3 - '@vitejs/plugin-react@4.3.1(vite@5.4.0)': + '@vitejs/plugin-react@4.3.1(vite@5.4.3)': dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.0 + vite: 5.4.3 transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@2.0.5(vitest@2.0.5(jsdom@24.1.1))': + '@vitest/coverage-v8@2.0.5(vitest@2.0.5(happy-dom@15.7.3))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -2478,11 +2307,11 @@ snapshots: istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.1.7 magic-string: 0.30.11 - magicast: 0.3.4 + magicast: 0.3.5 std-env: 3.7.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.0.5(jsdom@24.1.1) + vitest: 2.0.5(happy-dom@15.7.3) transitivePeerDependencies: - supports-color @@ -2519,42 +2348,30 @@ snapshots: loupe: 3.1.1 tinyrainbow: 1.2.0 - '@volar/language-core@2.3.4': + '@volar/language-core@2.4.2': dependencies: - '@volar/source-map': 2.3.4 - - '@volar/language-core@2.4.0-alpha.18': - dependencies: - '@volar/source-map': 2.4.0-alpha.18 - - '@volar/source-map@2.3.4': {} + '@volar/source-map': 2.4.2 - '@volar/source-map@2.4.0-alpha.18': {} + '@volar/source-map@2.4.2': {} - '@volar/typescript@2.3.4': + '@volar/typescript@2.4.2': dependencies: - '@volar/language-core': 2.3.4 + '@volar/language-core': 2.4.2 path-browserify: 1.0.1 vscode-uri: 3.0.8 - '@volar/typescript@2.4.0-alpha.18': + '@vue/compiler-core@3.5.2': dependencies: - '@volar/language-core': 2.4.0-alpha.18 - path-browserify: 1.0.1 - vscode-uri: 3.0.8 - - '@vue/compiler-core@3.4.38': - dependencies: - '@babel/parser': 7.25.3 - '@vue/shared': 3.4.38 + '@babel/parser': 7.25.6 + '@vue/shared': 3.5.2 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.0 - '@vue/compiler-dom@3.4.38': + '@vue/compiler-dom@3.5.2': dependencies: - '@vue/compiler-core': 3.4.38 - '@vue/shared': 3.4.38 + '@vue/compiler-core': 3.5.2 + '@vue/shared': 3.5.2 '@vue/compiler-vue2@2.7.16': dependencies: @@ -2563,10 +2380,10 @@ snapshots: '@vue/language-core@2.0.29(typescript@5.5.4)': dependencies: - '@volar/language-core': 2.4.0-alpha.18 - '@vue/compiler-dom': 3.4.38 + '@volar/language-core': 2.4.2 + '@vue/compiler-dom': 3.5.2 '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.4.38 + '@vue/shared': 3.5.2 computeds: 0.0.1 minimatch: 9.0.5 muggle-string: 0.4.1 @@ -2574,13 +2391,11 @@ snapshots: optionalDependencies: typescript: 5.5.4 - '@vue/reactivity@3.5.0-beta.2': + '@vue/reactivity@3.5.2': dependencies: - '@vue/shared': 3.5.0-beta.2 - - '@vue/shared@3.4.38': {} + '@vue/shared': 3.5.2 - '@vue/shared@3.5.0-beta.2': {} + '@vue/shared@3.5.2': {} acorn-jsx@5.3.2(acorn@8.12.1): dependencies: @@ -2588,12 +2403,6 @@ snapshots: acorn@8.12.1: {} - agent-base@7.1.1: - dependencies: - debug: 4.3.6 - transitivePeerDependencies: - - supports-color - ajv-draft-04@1.0.0(ajv@8.13.0): optionalDependencies: ajv: 8.13.0 @@ -2649,12 +2458,8 @@ snapshots: dependencies: dequal: 2.0.3 - array-union@2.1.0: {} - assertion-error@2.0.1: {} - asynckit@0.4.0: {} - balanced-match@1.0.2: {} brace-expansion@1.1.11: @@ -2672,8 +2477,8 @@ snapshots: browserslist@4.23.3: dependencies: - caniuse-lite: 1.0.30001651 - electron-to-chromium: 1.5.7 + caniuse-lite: 1.0.30001657 + electron-to-chromium: 1.5.14 node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.3) @@ -2681,7 +2486,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001651: {} + caniuse-lite@1.0.30001657: {} chai@5.1.1: dependencies: @@ -2716,10 +2521,6 @@ snapshots: color-name@1.1.4: {} - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - compare-versions@6.1.1: {} computeds@0.0.1: {} @@ -2736,42 +2537,25 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - cssstyle@4.0.1: - dependencies: - rrweb-cssom: 0.6.0 - csstype@3.1.3: {} - data-urls@5.0.0: - dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - de-indent@1.0.2: {} debug@4.3.6: dependencies: ms: 2.1.2 - decimal.js@10.4.3: {} - deep-eql@5.0.2: {} deep-is@0.1.4: {} - delayed-stream@1.0.0: {} - dequal@2.0.3: {} - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - dom-accessibility-api@0.5.16: {} eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.7: {} + electron-to-chromium@1.5.14: {} emoji-regex@8.0.0: {} @@ -2805,25 +2589,25 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - escalade@3.1.2: {} + escalade@3.2.0: {} escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} - eslint-config-prettier@9.1.0(eslint@9.9.0): + eslint-config-prettier@9.1.0(eslint@9.9.1): dependencies: - eslint: 9.9.0 + eslint: 9.9.1 - eslint-plugin-prettier@5.2.1(@types/eslint@9.6.0)(eslint-config-prettier@9.1.0(eslint@9.9.0))(eslint@9.9.0)(prettier@3.3.3): + eslint-plugin-prettier@5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.9.1))(eslint@9.9.1)(prettier@3.3.3): dependencies: - eslint: 9.9.0 + eslint: 9.9.1 prettier: 3.3.3 prettier-linter-helpers: 1.0.0 synckit: 0.9.1 optionalDependencies: - '@types/eslint': 9.6.0 - eslint-config-prettier: 9.1.0(eslint@9.9.0) + '@types/eslint': 9.6.1 + eslint-config-prettier: 9.1.0(eslint@9.9.1) eslint-scope@8.0.2: dependencies: @@ -2834,13 +2618,13 @@ snapshots: eslint-visitor-keys@4.0.0: {} - eslint@9.9.0: + eslint@9.9.1: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1) '@eslint-community/regexpp': 4.11.0 - '@eslint/config-array': 0.17.1 + '@eslint/config-array': 0.18.0 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.9.0 + '@eslint/js': 9.9.1 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.3.0 '@nodelib/fs.walk': 1.2.8 @@ -2919,7 +2703,7 @@ snapshots: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.7 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} @@ -2954,12 +2738,6 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 - form-data@4.0.0: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -3000,19 +2778,16 @@ snapshots: globals@15.9.0: {} - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - graceful-fs@4.2.11: {} graphemer@1.4.0: {} + happy-dom@15.7.3: + dependencies: + entities: 4.5.0 + webidl-conversions: 7.0.0 + whatwg-mimetype: 3.0.0 + has-flag@3.0.0: {} has-flag@4.0.0: {} @@ -3023,32 +2798,10 @@ snapshots: he@1.2.0: {} - html-encoding-sniffer@4.0.0: - dependencies: - whatwg-encoding: 3.1.1 - html-escaper@2.0.2: {} - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.1 - debug: 4.3.6 - transitivePeerDependencies: - - supports-color - - https-proxy-agent@7.0.5: - dependencies: - agent-base: 7.1.1 - debug: 4.3.6 - transitivePeerDependencies: - - supports-color - human-signals@5.0.0: {} - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - ignore@5.3.2: {} import-fresh@3.3.0: @@ -3060,7 +2813,7 @@ snapshots: imurmurhash@0.1.4: {} - is-core-module@2.15.0: + is-core-module@2.15.1: dependencies: hasown: 2.0.2 @@ -3076,8 +2829,6 @@ snapshots: is-path-inside@3.0.3: {} - is-potential-custom-element-name@1.0.1: {} - is-stream@3.0.0: {} isexe@2.0.0: {} @@ -3117,34 +2868,6 @@ snapshots: dependencies: argparse: 2.0.1 - jsdom@24.1.1: - dependencies: - cssstyle: 4.0.1 - data-urls: 5.0.0 - decimal.js: 10.4.3 - form-data: 4.0.0 - html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.12 - parse5: 7.1.2 - rrweb-cssom: 0.7.1 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.4 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 3.1.1 - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - ws: 8.18.0 - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - jsesc@2.5.2: {} json-buffer@3.0.1: {} @@ -3175,7 +2898,7 @@ snapshots: local-pkg@0.5.0: dependencies: mlly: 1.7.1 - pkg-types: 1.1.3 + pkg-types: 1.2.0 locate-path@6.0.0: dependencies: @@ -3209,10 +2932,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - magicast@0.3.4: + magicast@0.3.5: dependencies: - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 source-map-js: 1.2.0 make-dir@4.0.0: @@ -3223,17 +2946,11 @@ snapshots: merge2@1.4.1: {} - micromatch@4.0.7: + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - mimic-fn@4.0.0: {} minimatch@3.0.8: @@ -3254,7 +2971,7 @@ snapshots: dependencies: acorn: 8.12.1 pathe: 1.1.2 - pkg-types: 1.1.3 + pkg-types: 1.2.0 ufo: 1.5.4 ms@2.1.2: {} @@ -3271,8 +2988,6 @@ snapshots: dependencies: path-key: 4.0.0 - nwsapi@2.2.12: {} - onetime@6.0.0: dependencies: mimic-fn: 4.0.0 @@ -3300,10 +3015,6 @@ snapshots: dependencies: callsites: 3.1.0 - parse5@7.1.2: - dependencies: - entities: 4.5.0 - path-browserify@1.0.1: {} path-exists@4.0.0: {} @@ -3319,26 +3030,24 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-type@4.0.0: {} - pathe@1.1.2: {} pathval@2.0.0: {} - picocolors@1.0.1: {} + picocolors@1.1.0: {} picomatch@2.3.1: {} - pkg-types@1.1.3: + pkg-types@1.2.0: dependencies: confbox: 0.1.7 mlly: 1.7.1 pathe: 1.1.2 - postcss@8.4.41: + postcss@8.4.45: dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 + picocolors: 1.1.0 source-map-js: 1.2.0 prelude-ls@1.2.1: {} @@ -3355,12 +3064,8 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 - psl@1.9.0: {} - punycode@2.3.1: {} - querystringify@2.2.0: {} - queue-microtask@1.2.3: {} react-dom@18.3.1(react@18.3.1): @@ -3381,54 +3086,42 @@ snapshots: require-from-string@2.0.2: {} - requires-port@1.0.0: {} - resolve-from@4.0.0: {} resolve@1.22.8: dependencies: - is-core-module: 2.15.0 + is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 reusify@1.0.4: {} - rollup@4.20.0: + rollup@4.21.2: dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.20.0 - '@rollup/rollup-android-arm64': 4.20.0 - '@rollup/rollup-darwin-arm64': 4.20.0 - '@rollup/rollup-darwin-x64': 4.20.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.20.0 - '@rollup/rollup-linux-arm-musleabihf': 4.20.0 - '@rollup/rollup-linux-arm64-gnu': 4.20.0 - '@rollup/rollup-linux-arm64-musl': 4.20.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.20.0 - '@rollup/rollup-linux-riscv64-gnu': 4.20.0 - '@rollup/rollup-linux-s390x-gnu': 4.20.0 - '@rollup/rollup-linux-x64-gnu': 4.20.0 - '@rollup/rollup-linux-x64-musl': 4.20.0 - '@rollup/rollup-win32-arm64-msvc': 4.20.0 - '@rollup/rollup-win32-ia32-msvc': 4.20.0 - '@rollup/rollup-win32-x64-msvc': 4.20.0 + '@rollup/rollup-android-arm-eabi': 4.21.2 + '@rollup/rollup-android-arm64': 4.21.2 + '@rollup/rollup-darwin-arm64': 4.21.2 + '@rollup/rollup-darwin-x64': 4.21.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.2 + '@rollup/rollup-linux-arm-musleabihf': 4.21.2 + '@rollup/rollup-linux-arm64-gnu': 4.21.2 + '@rollup/rollup-linux-arm64-musl': 4.21.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.2 + '@rollup/rollup-linux-riscv64-gnu': 4.21.2 + '@rollup/rollup-linux-s390x-gnu': 4.21.2 + '@rollup/rollup-linux-x64-gnu': 4.21.2 + '@rollup/rollup-linux-x64-musl': 4.21.2 + '@rollup/rollup-win32-arm64-msvc': 4.21.2 + '@rollup/rollup-win32-ia32-msvc': 4.21.2 + '@rollup/rollup-win32-x64-msvc': 4.21.2 fsevents: 2.3.3 - rrweb-cssom@0.6.0: {} - - rrweb-cssom@0.7.1: {} - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - safer-buffer@2.1.2: {} - - saxes@6.0.0: - dependencies: - xmlchars: 2.2.0 - scheduler@0.23.2: dependencies: loose-envify: 1.4.0 @@ -3451,8 +3144,6 @@ snapshots: signal-exit@4.1.0: {} - slash@3.0.0: {} - source-map-js@1.2.0: {} source-map@0.6.1: {} @@ -3503,12 +3194,10 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - symbol-tree@3.2.4: {} - synckit@0.9.1: dependencies: '@pkgr/core': 0.1.1 - tslib: 2.6.3 + tslib: 2.7.0 test-exclude@7.0.1: dependencies: @@ -3520,7 +3209,7 @@ snapshots: tinybench@2.9.0: {} - tinypool@1.0.0: {} + tinypool@1.0.1: {} tinyrainbow@1.2.0: {} @@ -3532,32 +3221,21 @@ snapshots: dependencies: is-number: 7.0.0 - tough-cookie@4.1.4: - dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - - tr46@5.0.0: - dependencies: - punycode: 2.3.1 - ts-api-utils@1.3.0(typescript@5.5.4): dependencies: typescript: 5.5.4 - tslib@2.6.3: {} + tslib@2.7.0: {} type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.1.0(eslint@9.9.0)(typescript@5.5.4): + typescript-eslint@8.4.0(eslint@9.9.1)(typescript@5.5.4): dependencies: - '@typescript-eslint/eslint-plugin': 8.1.0(@typescript-eslint/parser@8.1.0(eslint@9.9.0)(typescript@5.5.4))(eslint@9.9.0)(typescript@5.5.4) - '@typescript-eslint/parser': 8.1.0(eslint@9.9.0)(typescript@5.5.4) - '@typescript-eslint/utils': 8.1.0(eslint@9.9.0)(typescript@5.5.4) + '@typescript-eslint/eslint-plugin': 8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1)(typescript@5.5.4))(eslint@9.9.1)(typescript@5.5.4) + '@typescript-eslint/parser': 8.4.0(eslint@9.9.1)(typescript@5.5.4) + '@typescript-eslint/utils': 8.4.0(eslint@9.9.1)(typescript@5.5.4) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: @@ -3572,30 +3250,23 @@ snapshots: universalify@0.1.2: {} - universalify@0.2.0: {} - update-browserslist-db@1.1.0(browserslist@4.23.3): dependencies: browserslist: 4.23.3 - escalade: 3.1.2 - picocolors: 1.0.1 + escalade: 3.2.0 + picocolors: 1.1.0 uri-js@4.4.1: dependencies: punycode: 2.3.1 - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - vite-node@2.0.5: dependencies: cac: 6.7.14 debug: 4.3.6 pathe: 1.1.2 tinyrainbow: 1.2.0 - vite: 5.4.0 + vite: 5.4.3 transitivePeerDependencies: - '@types/node' - less @@ -3607,11 +3278,11 @@ snapshots: - supports-color - terser - vite-plugin-dts@4.0.3(rollup@4.20.0)(typescript@5.5.4)(vite@5.4.0): + vite-plugin-dts@4.1.0(rollup@4.21.2)(typescript@5.5.4)(vite@5.4.3): dependencies: '@microsoft/api-extractor': 7.47.4 - '@rollup/pluginutils': 5.1.0(rollup@4.20.0) - '@volar/typescript': 2.3.4 + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) + '@volar/typescript': 2.4.2 '@vue/language-core': 2.0.29(typescript@5.5.4) compare-versions: 6.1.1 debug: 4.3.6 @@ -3621,21 +3292,21 @@ snapshots: typescript: 5.5.4 vue-tsc: 2.0.29(typescript@5.5.4) optionalDependencies: - vite: 5.4.0 + vite: 5.4.3 transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite@5.4.0: + vite@5.4.3: dependencies: esbuild: 0.21.5 - postcss: 8.4.41 - rollup: 4.20.0 + postcss: 8.4.45 + rollup: 4.21.2 optionalDependencies: fsevents: 2.3.3 - vitest@2.0.5(jsdom@24.1.1): + vitest@2.0.5(happy-dom@15.7.3): dependencies: '@ampproject/remapping': 2.3.0 '@vitest/expect': 2.0.5 @@ -3651,13 +3322,13 @@ snapshots: pathe: 1.1.2 std-env: 3.7.0 tinybench: 2.9.0 - tinypool: 1.0.0 + tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.0 + vite: 5.4.3 vite-node: 2.0.5 why-is-node-running: 2.3.0 optionalDependencies: - jsdom: 24.1.1 + happy-dom: 15.7.3 transitivePeerDependencies: - less - lightningcss @@ -3672,27 +3343,14 @@ snapshots: vue-tsc@2.0.29(typescript@5.5.4): dependencies: - '@volar/typescript': 2.4.0-alpha.18 + '@volar/typescript': 2.4.2 '@vue/language-core': 2.0.29(typescript@5.5.4) semver: 7.6.3 typescript: 5.5.4 - w3c-xmlserializer@5.0.0: - dependencies: - xml-name-validator: 5.0.0 - webidl-conversions@7.0.0: {} - whatwg-encoding@3.1.1: - dependencies: - iconv-lite: 0.6.3 - - whatwg-mimetype@4.0.0: {} - - whatwg-url@14.0.0: - dependencies: - tr46: 5.0.0 - webidl-conversions: 7.0.0 + whatwg-mimetype@3.0.0: {} which@2.0.2: dependencies: @@ -3717,12 +3375,6 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 - ws@8.18.0: {} - - xml-name-validator@5.0.0: {} - - xmlchars@2.2.0: {} - yallist@3.1.1: {} yallist@4.0.0: {} diff --git a/src/_utils.ts b/src/_utils.ts index b8158d2..1104ea2 100644 --- a/src/_utils.ts +++ b/src/_utils.ts @@ -10,48 +10,3 @@ export type IfAny = 0 extends 1 & T ? Y : N export const increment = (s: number) => s + 1 export const useForceUpdate = () => useReducer(increment, 0)[1] - -// compare whether a value has changed, accounting for NaN. -export const hasChanged = (value: any, oldValue: any): boolean => { - return value !== oldValue && (value === value || oldValue === oldValue) -} - -export const isArray = Array.isArray -export const objectToString = Object.prototype.toString -export const toTypeString = (value: unknown): string => { - return objectToString.call(value) -} -export const isMap = (value: unknown): value is Map => { - return toTypeString(value) === '[object Map]' -} -export const isSet = (value: unknown): value is Set => { - return toTypeString(value) === '[object Set]' -} -export const isDate = (value: unknown): value is Date => { - return value instanceof Date -} -export const isFunction = (value: unknown): value is (...args: any[]) => any => { - return typeof value === 'function' -} -export const isString = (value: unknown): value is string => { - return typeof value === 'string' -} -export const isSymbol = (value: unknown): value is symbol => { - return typeof value === 'symbol' -} -export const isObject = (value: unknown): value is Record => { - return value !== null && typeof value === 'object' -} -export const isPlainObject = (value: unknown): value is object => { - return toTypeString(value) === '[object Object]' -} -export const isPromise = (value: unknown): value is Promise => { - return isObject(value) && isFunction(value.then) && isFunction(value.catch) -} - -export const removeArrayItem = (array: T[], element: T) => { - const i = array.indexOf(element) - if (i > -1) { - array.splice(i, 1) - } -} diff --git a/src/computed.ts b/src/computed.ts index 3dd1ad2..64b4106 100644 --- a/src/computed.ts +++ b/src/computed.ts @@ -4,16 +4,16 @@ */ import { useState as useReactState } from 'react' -import { useWatch } from './watch/watch' -import { useForceUpdate } from './_utils' -import { computed as vComputed } from '@vue/reactivity' +import { computed as vueComputed } from '@vue/reactivity' import type { - ComputedGetter, - DebuggerOptions, ComputedRef, - WritableComputedOptions, + ComputedGetter, WritableComputedRef, + WritableComputedOptions, + DebuggerOptions, } from '@vue/reactivity' +import { useWatch } from './watch' +import { useForceUpdate } from './_utils' /** * Takes a getter function and returns a readonly reactive ref object for the @@ -55,7 +55,7 @@ export function useComputed( debugOptions?: DebuggerOptions, ): WritableComputedRef export function useComputed(arg1: any, arg2: any) { - const [value] = useReactState(() => vComputed(arg1, arg2)) + const [value] = useReactState(() => vueComputed(arg1, arg2)) const forceUpdate = useForceUpdate() useWatch(value, forceUpdate) return value diff --git a/src/effectScope.ts b/src/effectScope.ts index 73226ab..33512f0 100644 --- a/src/effectScope.ts +++ b/src/effectScope.ts @@ -4,7 +4,7 @@ */ import { useState as useReactState, useRef as useReactRef, useCallback as useReactCallback } from 'react' -import { effectScope } from '@vue/reactivity' +import { effectScope as vueEffectScope } from '@vue/reactivity' import { ArgumentTypes } from './_utils' /** @@ -16,9 +16,9 @@ import { ArgumentTypes } from './_utils' * @param detached - Can be used to create a "detached" effect scope. * @see {@link https://vuejs.org/api/reactivity-advanced.html#effectscope Vue `effectScope()`} */ -export function useEffectScope(...args: ArgumentTypes) { +export function useEffectScope(...args: ArgumentTypes) { const hasRun = useReactRef(false) - const [scope] = useReactState(() => effectScope(...args)) + const [scope] = useReactState(() => vueEffectScope(...args)) const originalRunRef = useReactRef(scope.run) const runFn = useReactCallback((fn: () => T) => { if (!hasRun.current) { diff --git a/src/index.ts b/src/index.ts index 9c66b1d..c0322ce 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,6 +5,7 @@ // redirect all APIs from @vue/reactivity export * from '@vue/reactivity' +export { watch as baseWatch } from '@vue/reactivity' // lifecycle hooks export { onMounted, onUpdated, onBeforeUnmount } from './lifecycle' @@ -22,15 +23,12 @@ export { useReadonly, useShallowReadonly } from './readonly' export { useComputed } from './computed' // watch and hooks -export { watch, useWatch } from './watch/watch' -export type { WatchOptions, WatchSource, MultiWatchSources, WatchCallback } from './watch/watch' +export { watch, useWatch } from './watch' +export type { WatchOptions, MultiWatchSources } from './watch' // watchEffect and hooks -export { watchEffect, useWatchEffect } from './watch/watchEffect' -export type { WatchEffect, WatchEffectOptions } from './watch/watchEffect' - -// watch handle -export type { WatchStopHandle, WatchHandle } from './watch/type' +export { watchEffect, useWatchEffect } from './watchEffect' +export type { WatchEffectOptions } from './watchEffect' // effectScope hooks export { useEffectScope } from './effectScope' diff --git a/src/reactive.ts b/src/reactive.ts index 5febacc..c3ca2fe 100644 --- a/src/reactive.ts +++ b/src/reactive.ts @@ -4,10 +4,10 @@ */ import { useState as useReactState } from 'react' -import { useWatch } from './watch/watch' -import { useForceUpdate } from './_utils' -import { reactive as vReactive, shallowReactive as vShallowReactive } from '@vue/reactivity' +import { reactive as vueReactive, shallowReactive as vueShallowReactive } from '@vue/reactivity' import type { Reactive, ShallowReactive } from '@vue/reactivity' +import { useWatch } from './watch' +import { useForceUpdate } from './_utils' /** * Returns a reactive proxy of the object. @@ -26,7 +26,7 @@ import type { Reactive, ShallowReactive } from '@vue/reactivity' */ export function useReactive(target: T): Reactive export function useReactive(target: object) { - const [value] = useReactState(() => vReactive(target)) + const [value] = useReactState(() => vueReactive(target)) const forceUpdate = useForceUpdate() useWatch(value, forceUpdate) return value @@ -63,7 +63,7 @@ export function useReactive(target: object) { * ``` */ export function useShallowReactive(target: T): ShallowReactive { - const [value] = useReactState(() => vShallowReactive(target)) + const [value] = useReactState(() => vueShallowReactive(target)) const forceUpdate = useForceUpdate() useWatch(value, forceUpdate) return value diff --git a/src/reactivity.ts b/src/reactivity.ts index d2c4f8a..4fc2bd5 100644 --- a/src/reactivity.ts +++ b/src/reactivity.ts @@ -3,7 +3,7 @@ * @author Surmon */ -import { useWatch } from './watch/watch' +import { useWatch } from './watch' import { useForceUpdate } from './_utils' /** diff --git a/src/readonly.ts b/src/readonly.ts index a1653b1..5beb2e0 100644 --- a/src/readonly.ts +++ b/src/readonly.ts @@ -4,10 +4,10 @@ */ import { useState as useReactState } from 'react' -import { useWatch } from './watch/watch' -import { useForceUpdate } from './_utils' -import { readonly as vReadonly, shallowReadonly as vShallowReadonly } from '@vue/reactivity' +import { readonly as vueReadonly, shallowReadonly as vueShallowReadonly } from '@vue/reactivity' import type { DeepReadonly, UnwrapNestedRefs } from '@vue/reactivity' +import { useWatch } from './watch' +import { useForceUpdate } from './_utils' /** * Takes an object (reactive or plain) or a ref and returns a readonly proxy to @@ -38,7 +38,7 @@ import type { DeepReadonly, UnwrapNestedRefs } from '@vue/reactivity' * ``` */ export function useReadonly(target: T): DeepReadonly> { - const [value] = useReactState(() => vReadonly(target)) + const [value] = useReactState(() => vueReadonly(target)) const forceUpdate = useForceUpdate() useWatch(value, forceUpdate) return value @@ -78,7 +78,7 @@ export function useReadonly(target: T): DeepReadonly(target: T): Readonly { - const [value] = useReactState(() => vShallowReadonly(target)) + const [value] = useReactState(() => vueShallowReadonly(target)) const forceUpdate = useForceUpdate() useWatch(value, forceUpdate) return value diff --git a/src/ref.ts b/src/ref.ts index 24282e3..8681eba 100644 --- a/src/ref.ts +++ b/src/ref.ts @@ -4,10 +4,10 @@ */ import { useState as useReactState } from 'react' -import { useForceUpdate, IfAny } from './_utils' -import { useWatch } from './watch/watch' -import { ref as vRef, shallowRef as vShallowRef, customRef as vCustomRef } from '@vue/reactivity' +import { ref as vueRef, shallowRef as vueShallowRef, customRef as vueCustomRef } from '@vue/reactivity' import type { Ref, UnwrapRef, ShallowRef, CustomRefFactory } from '@vue/reactivity' +import { useForceUpdate, IfAny } from './_utils' +import { useWatch } from './watch' /** * Takes an inner value and returns a reactive and mutable ref object, which @@ -30,10 +30,10 @@ export function useRef( ): [T] extends [Ref] ? IfAny, T> : Ref, UnwrapRef | T> export function useRef(): Ref export function useRef(initValue?: unknown) { - const [refObj] = useReactState(() => vRef(initValue)) + const [refObject] = useReactState(() => vueRef(initValue)) const forceUpdate = useForceUpdate() - useWatch(refObj, forceUpdate, { deep: true }) - return refObj as unknown as any + useWatch(refObject, forceUpdate, { deep: true }) + return refObject as unknown as any } /** @@ -56,10 +56,10 @@ export function useShallowRef( ): Ref extends T ? (T extends Ref ? IfAny, T> : ShallowRef) : ShallowRef export function useShallowRef(): ShallowRef export function useShallowRef(initValue?: unknown) { - const [sRefObj] = useReactState(() => vShallowRef(initValue)) + const [shallowRefObject] = useReactState(() => vueShallowRef(initValue)) const forceUpdate = useForceUpdate() - useWatch(sRefObj, forceUpdate) - return sRefObj + useWatch(shallowRefObject, forceUpdate) + return shallowRefObject } /** @@ -70,8 +70,8 @@ export function useShallowRef(initValue?: unknown) { * @see {@link https://vuejs.org/api/reactivity-advanced.html#customref Vue `customRef()`} */ export function useCustomRef(factory: CustomRefFactory): Ref { - const [cRefObj] = useReactState(() => vCustomRef(factory)) + const [customRefObject] = useReactState(() => vueCustomRef(factory)) const forceUpdate = useForceUpdate() - useWatch(cRefObj, forceUpdate) - return cRefObj + useWatch(customRefObject, forceUpdate) + return customRefObject } diff --git a/src/watch.ts b/src/watch.ts new file mode 100644 index 0000000..f7dd1ef --- /dev/null +++ b/src/watch.ts @@ -0,0 +1,121 @@ +/** + * @module veact.watch + * @author Surmon + */ + +import { useState as useReactState } from 'react' +import { watch as vueWatch } from '@vue/reactivity' +import type { + ReactiveMarker, + DebuggerOptions, + WatchCallback, + WatchSource, + WatchHandle, +} from '@vue/reactivity' +import { onBeforeUnmount } from './lifecycle' +import { logger } from './_logger' + +// changelog: https://github.com/vuejs/core/blob/main/CHANGELOG.md +// https://github.com/vuejs/core/blob/main/packages/runtime-core/src/apiWatch.ts +// https://github.com/vuejs/core/blob/main/packages/reactivity/src/watch.ts + +export interface WatchOptions extends DebuggerOptions { + immediate?: Immediate + deep?: boolean | number + once?: boolean + // The `flush` option is not supported in veact at the moment. + // flush?: 'pre' | 'post' | 'sync' +} + +export type MultiWatchSources = (WatchSource | object)[] + +type MaybeUndefined = I extends true ? T | undefined : T +type MapSources = { + [K in keyof T]: T[K] extends WatchSource + ? MaybeUndefined + : T[K] extends object + ? MaybeUndefined + : never +} + +/** + * Watches one or more reactive data sources and invokes a callback function when the sources change. + * + * @param source - The watcher's source. + * @param callback - This function will be called when the source is changed. + * @param options - An optional options object that does not support the `flush` option compared to Vue (3.5.0). + * @see {@link https://vuejs.org/api/reactivity-core.html#watch Vue `watch()`} + * + * @example + * ```js + * const count = ref(0) + * watch(count, (count, prevCount) => { + * // ... + * }) + * ``` + */ + +// overload: single source + cb +export function watch = false>( + source: WatchSource, + callback: WatchCallback>, + options?: WatchOptions, +): WatchHandle + +// overload: reactive array or tuple of multiple sources + cb +export function watch, Immediate extends Readonly = false>( + sources: readonly [...T] | T, + callback: [T] extends [ReactiveMarker] + ? WatchCallback> + : WatchCallback, MapSources>, + options?: WatchOptions, +): WatchHandle + +// overload: array of multiple sources + cb +export function watch = false>( + sources: [...T], + callback: WatchCallback, MapSources>, + options?: WatchOptions, +): WatchHandle + +// overload: watching reactive object w/ cb +export function watch = false>( + source: T, + callback: WatchCallback>, + options?: WatchOptions, +): WatchHandle + +// implementation +export function watch = false>( + source: T | WatchSource, + callback: WatchCallback, + options: WatchOptions = {}, +): WatchHandle { + return vueWatch(source as any, callback, { + ...options, + onWarn: logger.warn, + scheduler: (job) => job(), + }) +} + +/** + * Watches one or more reactive data sources and invokes a callback function when the sources change. + * + * @param source - The watcher's source. + * @param callback - This function will be called when the source is changed. + * @param options - An optional options object that does not support the `flush` option compared to Vue (3.5.0). + * @see {@link https://vuejs.org/api/reactivity-core.html#watch Vue `watch()`} + * + * @example + * ```js + * const count = useRef(0) + * useWatch(count, (count, prevCount) => { + * // ... + * }) + * ``` + */ +export const useWatch: typeof watch = (source: any, callback: any, options = {}) => { + const [watchHandle] = useReactState(() => watch(source as any, callback, options)) + onBeforeUnmount(() => watchHandle.stop()) + return watchHandle +} diff --git a/src/watch/patch.ts b/src/watch/patch.ts deleted file mode 100644 index 481aabd..0000000 --- a/src/watch/patch.ts +++ /dev/null @@ -1,83 +0,0 @@ -/** - * @module veact.watch.patch - * @author Surmon - */ - -import { isRef, ReactiveFlags } from '@vue/reactivity' -import { isArray, isObject, isSet, isMap, isFunction, isPromise, isPlainObject } from '../_utils' -import { logger } from '../_logger' - -export const NOOP_FN = () => {} - -// fork form: https://github.com/vuejs/core/blob/main/packages/runtime-core/src/errorHandling.ts -export const WATCH_GETTER_ERROR = 'watcher getter' -export const WATCH_CLEANUP_ERROR = 'watcher cleanup function' -export const WATCH_CALLBACK_ERROR = 'watcher callback' - -// fork from: https://github.com/vuejs/vue-next/blob/main/packages/runtime-core/src/errorHandling.ts -export function callWithErrorHandling(fn: Function, errorString: string, args?: unknown[]) { - try { - return args ? fn(...args) : fn() - } catch (error) { - logger.error(error, errorString) - } -} - -export function callWithAsyncErrorHandling( - fn: Function | Function[], - errorString: string, - args?: unknown[], -): any { - if (isFunction(fn)) { - const result = callWithErrorHandling(fn, errorString, args) - if (result && isPromise(result)) { - result.catch((error) => { - logger.error(error, errorString) - }) - } - return result - } - - if (isArray(fn)) { - const values = [] - for (let i = 0; i < fn.length; i++) { - values.push(callWithAsyncErrorHandling(fn[i], errorString, args)) - } - return values - } -} - -// fork form: https://github.com/vuejs/core/blob/main/packages/runtime-core/src/apiWatch.ts#L466 -export function traverse(value: unknown, depth: number = Infinity, seen?: Set): unknown { - if (depth <= 0 || !isObject(value) || (value as any)[ReactiveFlags.SKIP]) { - return value - } - - seen = seen || new Set() - if (seen.has(value)) { - return value - } - seen.add(value) - depth-- - if (isRef(value)) { - traverse(value.value, depth, seen) - } else if (isArray(value)) { - for (let i = 0; i < value.length; i++) { - traverse(value[i], depth, seen) - } - } else if (isSet(value) || isMap(value)) { - value.forEach((v: any) => { - traverse(v, depth, seen) - }) - } else if (isPlainObject(value)) { - for (const key in value) { - traverse(value[key], depth, seen) - } - for (const key of Object.getOwnPropertySymbols(value)) { - if (Object.prototype.propertyIsEnumerable.call(value, key)) { - traverse(value[key as any], depth, seen) - } - } - } - return value -} diff --git a/src/watch/type.ts b/src/watch/type.ts deleted file mode 100644 index 45b41d0..0000000 --- a/src/watch/type.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * @module veact.watch.type - * @author Surmon - */ - -import type { ReactiveEffect, EffectScope as _EffectScope } from '@vue/reactivity' - -export type OnCleanup = (cleanupFn: () => void) => void - -export type WatchStopHandle = () => void -export interface WatchHandle extends WatchStopHandle { - pause: () => void - resume: () => void - stop: () => void -} - -export interface EffectScope extends _EffectScope { - parent: any - cleanups: any[] - effects: ReactiveEffect[] -} diff --git a/src/watch/watch.ts b/src/watch/watch.ts deleted file mode 100644 index a54e9c7..0000000 --- a/src/watch/watch.ts +++ /dev/null @@ -1,285 +0,0 @@ -/** - * @module veact.watch.watch - * @author Surmon - */ - -import { useState as useReactState } from 'react' -import { isRef, isShallow, isReactive, getCurrentScope, EffectFlags, ReactiveEffect } from '@vue/reactivity' -import type { Ref, ComputedRef, ReactiveMarker, EffectScheduler, DebuggerOptions } from '@vue/reactivity' -import { onBeforeUnmount } from '../lifecycle' -import { logger } from '../_logger' -import { hasChanged, isArray, isFunction, removeArrayItem } from '../_utils' -import type { EffectScope, WatchHandle, OnCleanup } from './type' -import { - traverse, - NOOP_FN, - WATCH_GETTER_ERROR, - WATCH_CLEANUP_ERROR, - WATCH_CALLBACK_ERROR, - callWithErrorHandling, - callWithAsyncErrorHandling, -} from './patch' - -// fork form: https://github.com/vuejs/core/blob/main/packages/runtime-core/src/apiWatch.ts -// commits: https://github.com/vuejs/core/commits/main/packages/runtime-core/src/apiWatch.ts -// changelog: https://github.com/vuejs/core/blob/main/CHANGELOG.md - -// initial value for watchers to trigger on undefined initial values -const INITIAL_WATCHER_VALUE = {} - -const warnInvalidSource = (source: unknown) => { - logger.warn( - `Invalid watch source: `, - source, - `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`, - ) -} - -export interface WatchOptions extends DebuggerOptions { - immediate?: Immediate - deep?: boolean | number - once?: boolean - // The `flush` option is not supported in react at the moment. - // flush?: 'pre' | 'post' | 'sync' -} - -type WatchFn = () => T -export type WatchSource = Ref | ComputedRef | WatchFn -export type MultiWatchSources = (WatchSource | object)[] -export type WatchCallback = ( - value: Value, - oldValue: OldValue, - onCleanup: OnCleanup, -) => any - -type MaybeUndefined = I extends true ? T | undefined : T -type MapSources = { - [K in keyof T]: T[K] extends WatchSource - ? MaybeUndefined - : T[K] extends object - ? MaybeUndefined - : never -} - -/** - * Watches one or more reactive data sources and invokes a callback function when the sources change. - * - * @param source - The watcher's source. - * @param callback - This function will be called when the source is changed. - * @param options - An optional options object that does not support the `flush` option compared to Vue (3.5.0). - * @see {@link https://vuejs.org/api/reactivity-core.html#watch Vue `watch()`} - * - * @example - * ```js - * const count = ref(0) - * watch(count, (count, prevCount) => { - * // ... - * }) - * ``` - */ - -// overload: single source + cb -export function watch = false>( - source: WatchSource, - callback: WatchCallback>, - options?: WatchOptions, -): WatchHandle - -// overload: reactive array or tuple of multiple sources + cb -export function watch, Immediate extends Readonly = false>( - sources: readonly [...T] | T, - callback: [T] extends [ReactiveMarker] - ? WatchCallback> - : WatchCallback, MapSources>, - options?: WatchOptions, -): WatchHandle - -// overload: array of multiple sources + cb -export function watch = false>( - sources: [...T], - callback: WatchCallback, MapSources>, - options?: WatchOptions, -): WatchHandle - -// overload: watching reactive object w/ cb -export function watch = false>( - source: T, - callback: WatchCallback>, - options?: WatchOptions, -): WatchHandle - -// implementation -export function watch = false>( - source: T | WatchSource, - callback: WatchCallback, - options: WatchOptions = {}, -): WatchHandle { - const { immediate, deep, once, onTrack, onTrigger } = options - const reactiveGetter = (source: object) => { - // traverse will happen in wrapped getter below - if (deep) return source - // for `deep: false | 0` or shallow reactive, only traverse root-level properties - if (isShallow(source) || deep === false || deep === 0) return traverse(source, 1) - // for `deep: undefined` on a reactive object, deeply traverse all properties - return traverse(source) - } - - let watchHandle: WatchHandle - let getter: WatchFn - let forceTrigger = false - let isMultiSource = false - let effect: ReactiveEffect - - // In an SSR environment, callbacks need to be wrapped - if (once) { - const _callback = callback - callback = (...args) => { - _callback(...args) - watchHandle() - } - } - - if (isRef(source)) { - getter = () => source.value - forceTrigger = isShallow(source) - } else if (isReactive(source)) { - // @ts-ignore - getter = () => reactiveGetter(source) - forceTrigger = true - } else if (isArray(source)) { - isMultiSource = true - forceTrigger = source.some((s) => isReactive(s) || isShallow(s)) - getter = () => { - return source.map((s) => { - if (isRef(s)) { - return s.value - } else if (isReactive(s)) { - return reactiveGetter(s) - } else if (isFunction(s)) { - return callWithErrorHandling(s, WATCH_GETTER_ERROR) - } else { - warnInvalidSource(s) - } - }) - } - } else if (isFunction(source)) { - getter = () => callWithErrorHandling(source, WATCH_GETTER_ERROR) - } else { - getter = NOOP_FN - warnInvalidSource(source) - } - - if (deep) { - const baseGetter = getter - const depth = deep === true ? Infinity : deep - getter = () => traverse(baseGetter(), depth) - } - - let cleanup: (() => void) | undefined - let onCleanup: OnCleanup = (fn: () => void) => { - cleanup = effect.onStop = () => { - callWithErrorHandling(fn, WATCH_CLEANUP_ERROR) - cleanup = effect.onStop = undefined - } - } - - // in SSR there is no need to setup an actual effect, and it should be noop, unless it's eager. - // if (isSSR) { - // // we will also not call the invalidate callback (+ runner is not set up) - // onCleanup = NOOP_FN - // if (immediate) { - // callWithAsyncErrorHandling(callback, WATCH_CALLBACK_ERROR, [ - // getter(), - // isMultiSource ? [] : undefined, - // onCleanup, - // ]) - // } - // watchHandle = () => {} - // watchHandle.stop = NOOP_FN - // watchHandle.resume = NOOP_FN - // watchHandle.pause = NOOP_FN - // return watchHandle - // } - - let oldValue: any = isMultiSource - ? new Array((source as []).length).fill(INITIAL_WATCHER_VALUE) - : INITIAL_WATCHER_VALUE - - const scheduler: EffectScheduler = (immediateFirstRun?: boolean) => { - if (!((effect as any).flags & EffectFlags.ACTIVE) || (!effect.dirty && !immediateFirstRun)) { - return - } - const newValue = effect.run() - if ( - deep || - forceTrigger || - (isMultiSource - ? (newValue as any[]).some((v, i) => hasChanged(v, oldValue[i])) - : hasChanged(newValue, oldValue)) - ) { - // cleanup before running cb again - cleanup?.() - callWithAsyncErrorHandling(callback, WATCH_CALLBACK_ERROR, [ - newValue, - // pass undefined as the old value when it's changed for the first time - oldValue === INITIAL_WATCHER_VALUE - ? undefined - : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE - ? [] - : oldValue, - onCleanup, - ]) - oldValue = newValue - } - } - - effect = new ReactiveEffect(getter) - effect.scheduler = scheduler - effect.onTrack = onTrack - effect.onTrigger = onTrigger - - const scope = getCurrentScope() - // @ts-ignore - watchHandle = () => { - effect.stop() - if (scope) { - removeArrayItem((scope as EffectScope).effects, effect) - } - } - - watchHandle.pause = effect.pause.bind(effect) - watchHandle.resume = effect.resume.bind(effect) - watchHandle.stop = watchHandle - - // initial run - if (immediate) { - scheduler(true) - } else { - oldValue = effect.run() - } - - // stop handle - return watchHandle -} - -/** - * Watches one or more reactive data sources and invokes a callback function when the sources change. - * - * @param source - The watcher's source. - * @param callback - This function will be called when the source is changed. - * @param options - An optional options object that does not support the `flush` option compared to Vue (3.5.0). - * @see {@link https://vuejs.org/api/reactivity-core.html#watch Vue `watch()`} - * - * @example - * ```js - * const count = useRef(0) - * useWatch(count, (count, prevCount) => { - * // ... - * }) - * ``` - */ -export const useWatch: typeof watch = (source: any, callback: any, options = {}) => { - const [watchHandle] = useReactState(() => watch(source as any, callback, options)) - onBeforeUnmount(() => watchHandle.stop()) - return watchHandle -} diff --git a/src/watch/watchEffect.ts b/src/watch/watchEffect.ts deleted file mode 100644 index f2264a9..0000000 --- a/src/watch/watchEffect.ts +++ /dev/null @@ -1,113 +0,0 @@ -/** - * @module veact.watch.watchEffect - * @author Surmon - */ - -// DOC: https://vuejs.org/api/reactivity-core.html#watcheffect -// fork form: https://github.com/vuejs/core/blob/main/packages/runtime-core/src/apiWatch.ts#L82 -import { useState as useReactState } from 'react' -import { getCurrentScope, EffectFlags, ReactiveEffect } from '@vue/reactivity' -import type { DebuggerOptions, EffectScheduler } from '@vue/reactivity' -import { onBeforeUnmount } from '../lifecycle' -import { removeArrayItem } from '../_utils' -import type { OnCleanup, EffectScope, WatchHandle } from './type' -import { - WATCH_CLEANUP_ERROR, - WATCH_CALLBACK_ERROR, - callWithErrorHandling, - callWithAsyncErrorHandling, -} from './patch' - -export type WatchEffectOptions = DebuggerOptions -export type WatchEffect = (onCleanup: OnCleanup) => void - -/** - * Runs a function immediately while reactively tracking its dependencies and re-runs it whenever the dependencies are changed. - * - * @param effectFn - The effect function to run. - * @param options - An optional options object that can be used to adjust the effect's flush timing or to debug the effect's dependencies; the `flush` option is not supported compared to Vue (3.5.0). - * @see {@link https://vuejs.org/api/reactivity-core.html#watcheffect Vue `watchEffect()`} - * - * @example - * ```js - * const count = ref(0) - * watchEffect(() => console.log(count.value)) - * // -> logs 0 - * - * count.value++ - * // -> logs 1 - * ``` - */ -export function watchEffect(effectFn: WatchEffect, options: WatchEffectOptions = {}): WatchHandle { - let effect: ReactiveEffect - let watchHandle: WatchHandle - let cleanup: (() => void) | undefined - - const onCleanup: OnCleanup = (fn: () => void) => { - cleanup = effect.onStop = () => { - callWithErrorHandling(fn, WATCH_CLEANUP_ERROR) - cleanup = effect.onStop = undefined - } - } - - const getter = () => { - // cleanup before running cb again - cleanup?.() - return callWithAsyncErrorHandling(effectFn, WATCH_CALLBACK_ERROR, [onCleanup]) - } - - const scheduler: EffectScheduler = () => { - if (!((effect as any).flags & EffectFlags.ACTIVE) || !effect.dirty) { - return - } - effect.run() - } - - // effect - effect = new ReactiveEffect(getter) - effect.scheduler = scheduler - effect.onTrack = options.onTrack - effect.onTrigger = options.onTrigger - - const scope = getCurrentScope() - // @ts-ignore - watchHandle = () => { - effect.stop() - if (scope) { - removeArrayItem((scope as EffectScope).effects, effect) - } - } - - watchHandle.pause = effect.pause.bind(effect) - watchHandle.resume = effect.resume.bind(effect) - watchHandle.stop = watchHandle - - // initial run - effect.run() - - // stop handle - return watchHandle -} - -/** - * Runs a function immediately while reactively tracking its dependencies and re-runs it whenever the dependencies are changed. - * - * @param effect - The effect function to run. - * @param options - An optional options object that can be used to adjust the effect's flush timing or to debug the effect's dependencies; the `flush` option is not supported compared to Vue (3.5.0). - * @see {@link https://vuejs.org/api/reactivity-core.html#watcheffect Vue `watchEffect()`} - * - * @example - * ```js - * const count = useRef(0) - * useWatchEffect(() => console.log(count.value)) - * // -> logs 0 - * - * count.value++ - * // -> logs 1 - * ``` - */ -export const useWatchEffect: typeof watchEffect = (effect: any, options?: any) => { - const [watchHandle] = useReactState(() => watchEffect(effect, options)) - onBeforeUnmount(() => watchHandle.stop()) - return watchHandle -} diff --git a/src/watchEffect.ts b/src/watchEffect.ts new file mode 100644 index 0000000..9abff04 --- /dev/null +++ b/src/watchEffect.ts @@ -0,0 +1,64 @@ +/** + * @module veact.watchEffect + * @author Surmon + */ + +import { useState as useReactState } from 'react' +import { watch as vueWatch } from '@vue/reactivity' +import type { WatchEffect, WatchHandle, DebuggerOptions } from '@vue/reactivity' +import { onBeforeUnmount } from './lifecycle' +import { logger } from './_logger' + +// changelog: https://github.com/vuejs/core/blob/main/CHANGELOG.md +// https://github.com/vuejs/core/blob/main/packages/runtime-core/src/apiWatch.ts +// https://github.com/vuejs/core/blob/main/packages/reactivity/src/watch.ts + +export type WatchEffectOptions = DebuggerOptions + +/** + * Runs a function immediately while reactively tracking its dependencies and re-runs it whenever the dependencies are changed. + * + * @param effectFn - The effect function to run. + * @param options - An optional options object that can be used to adjust the effect's flush timing or to debug the effect's dependencies; the `flush` option is not supported compared to Vue (3.5.0). + * @see {@link https://vuejs.org/api/reactivity-core.html#watcheffect Vue `watchEffect()`} + * + * @example + * ```js + * const count = ref(0) + * watchEffect(() => console.log(count.value)) + * // -> logs 0 + * + * count.value++ + * // -> logs 1 + * ``` + */ +export function watchEffect(effectFn: WatchEffect, options: WatchEffectOptions = {}): WatchHandle { + return vueWatch(effectFn, null, { + ...options, + onWarn: logger.warn, + scheduler: (job) => job(), + }) +} + +/** + * Runs a function immediately while reactively tracking its dependencies and re-runs it whenever the dependencies are changed. + * + * @param effect - The effect function to run. + * @param options - An optional options object that can be used to adjust the effect's flush timing or to debug the effect's dependencies; the `flush` option is not supported compared to Vue (3.5.0). + * @see {@link https://vuejs.org/api/reactivity-core.html#watcheffect Vue `watchEffect()`} + * + * @example + * ```js + * const count = useRef(0) + * useWatchEffect(() => console.log(count.value)) + * // -> logs 0 + * + * count.value++ + * // -> logs 1 + * ``` + */ +export const useWatchEffect: typeof watchEffect = (effect: any, options?: any) => { + const [watchHandle] = useReactState(() => watchEffect(effect, options)) + onBeforeUnmount(() => watchHandle.stop()) + return watchHandle +} diff --git a/tests/apis.spec.ts b/tests/apis.spec.ts index af683dc..62f5b19 100644 --- a/tests/apis.spec.ts +++ b/tests/apis.spec.ts @@ -22,11 +22,14 @@ import { } from '../src' test(' should be export all @vue/reactivity members', () => { + expect(vueReactivity.watch).toBe(veact.baseWatch) expect( - Object.keys(vueReactivity).every((key) => { - const targetMember = veact[key] - return targetMember && vueReactivity[key] === targetMember - }), + Object.keys(vueReactivity) + .filter((key) => key !== 'watch') + .every((key) => { + const targetMember = (veact as any)[key] + return targetMember && (vueReactivity as any)[key] === targetMember + }), ).toBeTruthy() }) diff --git a/tests/effectScope.spec.ts b/tests/effectScope.spec.ts index 71f17f4..c7fe906 100644 --- a/tests/effectScope.spec.ts +++ b/tests/effectScope.spec.ts @@ -1,6 +1,16 @@ import { test, expect } from 'vitest' import { renderHook, act } from '@testing-library/react' -import { ref, reactive, useRef, watch, EffectScope, onUpdated, useEffectScope, onScopeDispose } from '../src' +import { + ref, + reactive, + useRef, + watch, + EffectScope, + onUpdated, + useEffectScope, + getCurrentScope, + onScopeDispose, +} from '../src' test('', () => { let renderCount = 0 @@ -27,6 +37,10 @@ test('', () => { onScopeDispose(() => { scopeDisposed = true }) + + const currentScope = getCurrentScope() + expect(currentScope).toBeDefined() + expect(getCurrentScope()).toBe(currentScope) }) return { diff --git a/tests/watch.spec.ts b/tests/watch.spec.ts index 310e87a..d93c068 100644 --- a/tests/watch.spec.ts +++ b/tests/watch.spec.ts @@ -1,14 +1,15 @@ import { test, expect } from 'vitest' import { renderHook, act } from '@testing-library/react' -import { ref, reactive, watch, useRef, useWatch, onUpdated } from '../src' +import { ref, reactive, watch, useRef, useWatch, onUpdated, onWatcherCleanup } from '../src' -test(' onCleanup / watchHandle', () => { +test(' watchHandle / onCleanup / onWatcherCleanup', () => { const logs: any[] = [] const count = ref(0) const watchHandle = watch(count, (value, _, onCleanup) => { logs.push(value) onCleanup(() => logs.push('onCleanup')) + onWatcherCleanup(() => logs.push('onWatcherCleanup')) }) expect(logs.length).toBe(0) @@ -30,14 +31,18 @@ test(' onCleanup / watchHandle', () => { watchHandle.resume() count.value = 3 expect(logs.at(-1)).toBe(3) + expect(logs.length).toBe(7) watchHandle() - expect(logs.at(-2)).toBe(3) - expect(logs.at(-1)).toBe('onCleanup') + expect(logs.length).toBe(9) + expect(logs.at(-1)).toBe('onWatcherCleanup') + expect(logs.at(-2)).toBe('onCleanup') + expect(logs.at(-3)).toBe(3) count.value = 4 expect(count.value).toBe(4) - expect(logs.at(-1)).toBe('onCleanup') + expect(logs.length).toBe(9) + expect(logs.at(-1)).toBe('onWatcherCleanup') }) test(' { immediate: true }', () => { diff --git a/tests/watchEffect.spec.ts b/tests/watchEffect.spec.ts index 8159b49..32ae926 100644 --- a/tests/watchEffect.spec.ts +++ b/tests/watchEffect.spec.ts @@ -1,13 +1,14 @@ import { test, expect } from 'vitest' import { renderHook, act } from '@testing-library/react' -import { ref, watchEffect, useWatchEffect } from '../src' +import { ref, watchEffect, useWatchEffect, onEffectCleanup } from '../src' -test('', () => { +test(' watchHandle / onCleanup / onEffectCleanup', () => { const logs: any[] = [] const count = ref(0) const watchHandle = watchEffect((onCleanup) => { logs.push(count.value) onCleanup(() => logs.push('onCleanup')) + onEffectCleanup(() => logs.push('onEffectCleanup')) }) expect(logs.length).toBe(1) @@ -17,6 +18,7 @@ test('', () => { expect(count.value).toBe(1) expect(logs.at(-1)).toBe(1) expect(logs.at(-2)).toBe('onCleanup') + expect(logs.at(-3)).toBe('onEffectCleanup') count.value++ expect(count.value).toBe(2) @@ -25,20 +27,22 @@ test('', () => { watchHandle.pause() count.value++ - expect(logs.length).toBe(5) + expect(logs.length).toBe(7) watchHandle.resume() count.value++ expect(logs.at(-1)).toBe(4) watchHandle() - expect(logs.at(-2)).toBe(4) expect(logs.at(-1)).toBe('onCleanup') + expect(logs.at(-2)).toBe('onEffectCleanup') + expect(logs.at(-3)).toBe(4) count.value++ expect(count.value).toBe(5) - expect(logs.length).toBe(10) + expect(logs.length).toBe(15) expect(logs.at(-1)).toBe('onCleanup') + expect(logs.at(-2)).toBe('onEffectCleanup') }) test('', () => { diff --git a/tsconfig.json b/tsconfig.json index 7aa218c..926f446 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,5 +16,5 @@ "noImplicitReturns": true, "outDir": "dist" }, - "exclude": ["node_modules", "dist", "dev", "tests"] + "exclude": ["node_modules", "dist"] } diff --git a/vite.config.ts b/vite.config.ts index 4b69257..0206637 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -23,7 +23,7 @@ export default defineConfig({ // https://github.com/qmhc/vite-plugin-dts plugins: [viteReact(), viteDts({ rollupTypes: true })], test: { - environment: 'jsdom', + environment: 'happy-dom', coverage: { include: ['src/**/*'], },