diff --git a/apps/docs/src/pages/react/hooks/_meta.en.json b/apps/docs/src/pages/react/hooks/_meta.en.json index 7e543a5..eb6ca15 100644 --- a/apps/docs/src/pages/react/hooks/_meta.en.json +++ b/apps/docs/src/pages/react/hooks/_meta.en.json @@ -1,5 +1,8 @@ { "useInterval": "useInterval", "useMediaQuery": "useMediaQuery", - "useSecTimer": "useSecTimer" + "useSecTimer": "useSecTimer", + "usePreventDuplicateClick": "usePreventDuplicateClick", + "useDebounce": "useDebounce", + "useThrottle": "useThrottle" } \ No newline at end of file diff --git a/apps/docs/src/pages/react/hooks/_meta.ko.json b/apps/docs/src/pages/react/hooks/_meta.ko.json index 7e543a5..eb6ca15 100644 --- a/apps/docs/src/pages/react/hooks/_meta.ko.json +++ b/apps/docs/src/pages/react/hooks/_meta.ko.json @@ -1,5 +1,8 @@ { "useInterval": "useInterval", "useMediaQuery": "useMediaQuery", - "useSecTimer": "useSecTimer" + "useSecTimer": "useSecTimer", + "usePreventDuplicateClick": "usePreventDuplicateClick", + "useDebounce": "useDebounce", + "useThrottle": "useThrottle" } \ No newline at end of file diff --git a/apps/docs/src/pages/react/hooks/usePreventDuplicateClick.en.md b/apps/docs/src/pages/react/hooks/usePreventDuplicateClick.en.md new file mode 100644 index 0000000..c2a1e9e --- /dev/null +++ b/apps/docs/src/pages/react/hooks/usePreventDuplicateClick.en.md @@ -0,0 +1,51 @@ +# usePreventDuplicateClick + +The `usePreventDuplicateClick` hook prevents duplicate clicks on a button or other clickable elements by disabling the +click handler while an asynchronous callback function is being executed. This ensures that the callback is not called +multiple times concurrently, which is useful for avoiding issues such as submitting a form multiple times. + +## API + +```ts +function usePreventDuplicateClick(): { disabled: boolean; handleClick: (callback: () => Promise) => void }; +``` + +## Parameters + +None + +## Return value + +- `disabled` (boolean): A state indicating whether the click handler is currently disabled. +- `handleClick` (function): A function that takes an asynchronous callback function as an argument and ensures it is + only executed once at a time. + +```jsx +import React from 'react'; +import { usePreventDuplicateClick } from './usePreventDuplicateClick'; + +const ExampleComponent = () => { + const { disabled, handleClick } = usePreventDuplicateClick(); + + const handleSubmit = async () => { + // Simulated async operation + await new Promise(resolve => setTimeout(resolve, 1000)); + console.log('Form submitted!'); + }; + + return ( +
+ +
+ ); +}; +``` + +## Notes + +- This hook internally manages a `loadingRef` to track whether the callback is currently + executing (`loadingRef.current`). +- It sets the `disabled` state of the button to prevent multiple clicks until the callback completes. +- This pattern is commonly used in UI elements such as forms to prevent duplicate user actions. \ No newline at end of file diff --git a/apps/docs/src/pages/react/hooks/usePreventDuplicateClick.ko.md b/apps/docs/src/pages/react/hooks/usePreventDuplicateClick.ko.md new file mode 100644 index 0000000..04261bf --- /dev/null +++ b/apps/docs/src/pages/react/hooks/usePreventDuplicateClick.ko.md @@ -0,0 +1,49 @@ +# usePreventDuplicateClick + +`usePreventDuplicateClick` 훅은 버튼이나 기타 클릭 가능한 요소에서 중복 클릭을 방지합니다. 이는 비동기 콜백 함수가 실행 중일 때 클릭 핸들러를 비활성화하여, 콜백이 여러 번 동시에 호출되는 +것을 +방지합니다. 이는 폼을 여러 번 제출하는 등의 문제를 방지하는 데 유용합니다. + +## API + +```ts +function usePreventDuplicateClick(): { disabled: boolean; handleClick: (callback: () => Promise) => void }; +``` + +## Parameters + +None + +## Return value + +- `disabled` (boolean): 클릭 핸들러가 현재 비활성화된 상태인지를 나타내는 상태 값입니다. +- `handleClick` (function): 비동기 콜백 함수를 인자로 받아 한 번에 한 번씩만 실행되도록 보장하는 함수입니다. + +```jsx +import React from 'react'; +import { usePreventDuplicateClick } from './usePreventDuplicateClick'; + +const ExampleComponent = () => { + const { disabled, handleClick } = usePreventDuplicateClick(); + + const handleSubmit = async () => { + // 비동기 작업 시뮬레이션 + await new Promise(resolve => setTimeout(resolve, 1000)); + console.log('폼 제출됨!'); + }; + + return ( +
+ +
+ ); +}; +``` + +## Notes + +- 이 훅은 내부적으로 `loadingRef`를 관리하여 현재 콜백이 실행 중인지를 추적합니다 (`loadingRef.current`). +- 콜백이 완료될 때까지 여러 번의 클릭을 방지하기 위해 버튼의 `disabled` 상태를 설정합니다. +- 이 패턴은 주로 중복 사용자 작업을 방지해야 하는 폼 등의 UI 요소에서 사용됩니다. \ No newline at end of file diff --git a/packages/react/package.json b/packages/react/package.json index b829193..f41fa39 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -35,6 +35,7 @@ "test": "vitest" }, "devDependencies": { + "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "^15.0.7", "@yourssu/utils": "workspace:*" } diff --git a/packages/react/src/hooks/usePreventDuplicateClick.test.tsx b/packages/react/src/hooks/usePreventDuplicateClick.test.tsx new file mode 100644 index 0000000..63b0b3f --- /dev/null +++ b/packages/react/src/hooks/usePreventDuplicateClick.test.tsx @@ -0,0 +1,64 @@ +import '@testing-library/jest-dom'; +import { render, waitFor, fireEvent } from '@testing-library/react'; +import { usePreventDuplicateClick } from './usePreventDuplicateClick'; +import { describe, it, expect, vi } from 'vitest'; + +const TestComponent = ({ callback }: { callback: () => Promise }) => { + const { disabled, handleClick } = usePreventDuplicateClick(); + + return ( + + ); +}; + +describe('usePreventDuplicateClick', () => { + it('should disable click during callback execution and enable after', async () => { + const callback = vi.fn().mockImplementation(() => { + return new Promise((resolve) => setTimeout(resolve, 100)); + }); + + const { getByText } = render(); + const button = getByText('Click me'); + + // Initial state + expect(button).not.toBeDisabled(); + + // Act: simulate click + fireEvent.click(button); + + // Check if disabled during callback + expect(button).toBeDisabled(); + + // Wait for callback to finish + await waitFor(() => expect(button).not.toBeDisabled()); + + // Check that the callback was called + expect(callback).toHaveBeenCalledTimes(1); + }); + + it('should not allow multiple clicks', async () => { + const callback = vi.fn().mockImplementation(() => { + return new Promise((resolve) => setTimeout(resolve, 100)); + }); + + const { getByText } = render(); + const button = getByText('Click me'); + + // Act: simulate first click + fireEvent.click(button); + + // Act: simulate second click before the first one completes + fireEvent.click(button); + + // Check if disabled during callback + expect(button).toBeDisabled(); + + // Wait for callback to finish + await waitFor(() => expect(button).not.toBeDisabled()); + + // Check that the callback was called only once + expect(callback).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/react/src/hooks/usePreventDuplicateClick.ts b/packages/react/src/hooks/usePreventDuplicateClick.ts new file mode 100644 index 0000000..c71161f --- /dev/null +++ b/packages/react/src/hooks/usePreventDuplicateClick.ts @@ -0,0 +1,20 @@ +import { useCallback, useRef, useState } from 'react'; + +export const usePreventDuplicateClick = () => { + const [disabled, setDisabled] = useState(false); + const loadingRef = useRef(false); + + const handleClick = useCallback(async (callback: () => Promise) => { + if (loadingRef.current) return; + + loadingRef.current = true; + setDisabled(true); + + await callback(); + + loadingRef.current = false; + setDisabled(false); + }, []); + + return { disabled, handleClick }; +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1e5c504..c725cc6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,7 +50,7 @@ importers: version: 18.3.1(react@18.3.1) tsup: specifier: ^8.0.2 - version: 8.1.0(typescript@5.5.2) + version: 8.1.0(@microsoft/api-extractor@7.43.0(@types/node@20.14.9))(postcss@8.4.38)(typescript@5.5.2) turbo: specifier: latest version: 2.0.5 @@ -59,13 +59,13 @@ importers: version: 5.5.2 vitest: specifier: ^1.6.0 - version: 1.6.0(@vitest/ui@1.6.0)(jsdom@24.1.0) + version: 1.6.0(@types/node@20.14.9)(@vitest/ui@1.6.0(vitest@1.6.0))(jsdom@24.1.0) apps/config-example: devDependencies: '@vitejs/plugin-react': specifier: ^4.3.0 - version: 4.3.1(vite@5.3.1) + version: 4.3.1(vite@5.3.1(@types/node@20.14.9)) '@yourssu/eslint-config': specifier: workspace:* version: link:../../packages/eslint-config @@ -74,22 +74,22 @@ importers: version: link:../../packages/prettier-config vite: specifier: ^5.2.0 - version: 5.3.1 + version: 5.3.1(@types/node@20.14.9) vite-plugin-dts: specifier: ^3.5.3 - version: 3.9.1(typescript@5.5.2)(vite@5.3.1) + version: 3.9.1(@types/node@20.14.9)(rollup@4.18.0)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.9)) apps/docs: dependencies: next: specifier: ^14.2.4 - version: 14.2.4(react-dom@18.3.1)(react@18.3.1) + version: 14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nextra: specifier: latest - version: 2.13.4(next@14.2.4)(react-dom@18.3.1)(react@18.3.1) + version: 2.13.4(next@14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nextra-theme-docs: specifier: latest - version: 2.13.4(next@14.2.4)(nextra@2.13.4)(react-dom@18.3.1)(react@18.3.1) + version: 2.13.4(next@14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: '@types/node': specifier: 18.11.10 @@ -99,19 +99,19 @@ importers: devDependencies: '@vitejs/plugin-react': specifier: ^4.3.0 - version: 4.3.1(vite@4.5.3) + version: 4.3.1(vite@4.5.3(@types/node@20.14.9)) '@yourssu/logging-system-react': specifier: workspace:* version: link:../../packages/logging-system react-router-dom: specifier: ^6.21.3 - version: 6.24.0(react-dom@18.3.1)(react@18.3.1) + version: 6.24.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) vite: specifier: ^4.4.5 - version: 4.5.3 + version: 4.5.3(@types/node@20.14.9) vite-plugin-dts: specifier: ^3.5.3 - version: 3.9.1(typescript@5.5.2)(vite@4.5.3) + version: 3.9.1(@types/node@20.14.9)(rollup@4.18.0)(typescript@5.5.2)(vite@4.5.3(@types/node@20.14.9)) packages/crypto: devDependencies: @@ -135,10 +135,10 @@ importers: version: 9.1.0(eslint@8.57.0) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@7.5.0)(eslint-plugin-import@2.25.3)(eslint@8.57.0) + version: 3.6.1(@typescript-eslint/parser@7.5.0(eslint@8.57.0)(typescript@5.5.2))(eslint-plugin-import@2.25.3)(eslint@8.57.0) eslint-plugin-import: specifier: 2.25.3 - version: 2.25.3(@typescript-eslint/parser@7.5.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + version: 2.25.3(@typescript-eslint/parser@7.5.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-jsx-a11y: specifier: 6.8.0 version: 6.8.0(eslint@8.57.0) @@ -147,7 +147,7 @@ importers: version: 1.5.3 eslint-plugin-prettier: specifier: ^5.1.0 - version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.3.2) + version: 5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.2) eslint-plugin-react: specifier: 7.34.1 version: 7.34.1(eslint@8.57.0) @@ -177,7 +177,7 @@ importers: version: 1.7.2 react-router-dom: specifier: ^6.21.3 - version: 6.24.0(react-dom@18.3.1)(react@18.3.1) + version: 6.24.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) packages/prettier-config: dependencies: @@ -187,9 +187,12 @@ importers: packages/react: devDependencies: + '@testing-library/jest-dom': + specifier: ^6.4.6 + version: 6.4.6(vitest@1.6.0(@types/node@20.14.9)(@vitest/ui@1.6.0(vitest@1.6.0))(jsdom@24.1.0)) '@testing-library/react': specifier: ^15.0.7 - version: 15.0.7(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + version: 15.0.7(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@yourssu/utils': specifier: workspace:* version: link:../utils @@ -205,6 +208,9 @@ importers: packages: + '@adobe/css-tools@4.4.0': + resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -1058,6 +1064,27 @@ packages: resolution: {integrity: sha512-CytIvb6tVOADRngTHGWNxH8LPgO/3hi/BdCEHOf7Qd2GvZVClhVP0Wo/QHzWhpki49Bk0b4VT6xpt3fx8HTSIw==} engines: {node: '>=18'} + '@testing-library/jest-dom@6.4.6': + resolution: {integrity: sha512-8qpnGVincVDLEcQXWaHOf6zmlbwTKc6Us6PPu4CRnPXCzo2OGBS5cwgMMOWdxDpEz1mkbvXHpEy99M5Yvt682w==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + peerDependencies: + '@jest/globals': '>= 28' + '@types/bun': latest + '@types/jest': '>= 28' + jest: '>= 28' + vitest: '>= 0.32' + peerDependenciesMeta: + '@jest/globals': + optional: true + '@types/bun': + optional: true + '@types/jest': + optional: true + jest: + optional: true + vitest: + optional: true + '@testing-library/react@15.0.7': resolution: {integrity: sha512-cg0RvEdD1TIhhkm1IeYMQxrzy0MtUNfa3minv4MjbgcYzJAZ7yD0i0lwoPOTPr+INtiXFezt2o8xMSnyHhEn2Q==} engines: {node: '>=18'} @@ -1565,6 +1592,10 @@ packages: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} + chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -1689,6 +1720,9 @@ packages: crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + cssstyle@4.0.1: resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} engines: {node: '>=18'} @@ -1966,6 +2000,9 @@ packages: dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dompurify@3.1.5: resolution: {integrity: sha512-lwG+n5h8QNpxtyrJW/gJWckL+1/DQiYMX8f7t8Z2AZTPw1esVrqjI63i7Zc2Gz0aKzLVMYC1V1PL/ky+aY/NgA==} @@ -2590,6 +2627,10 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -3218,6 +3259,10 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + minimatch@3.0.8: resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} @@ -3671,6 +3716,10 @@ packages: reading-time@1.5.0: resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + reflect.getprototypeof@1.0.6: resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} @@ -3986,6 +4035,10 @@ packages: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -4607,6 +4660,8 @@ packages: snapshots: + '@adobe/css-tools@4.4.0': {} + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.5 @@ -5077,9 +5132,9 @@ snapshots: '@eslint/js@8.57.0': {} - '@headlessui/react@1.7.19(react-dom@18.3.1)(react@18.3.1)': + '@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/react-virtual': 3.7.0(react-dom@18.3.1)(react@18.3.1) + '@tanstack/react-virtual': 3.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) client-only: 0.0.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -5170,23 +5225,23 @@ snapshots: '@types/react': 18.3.3 react: 18.3.1 - '@microsoft/api-extractor-model@7.28.13': + '@microsoft/api-extractor-model@7.28.13(@types/node@20.14.9)': dependencies: '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2 + '@rushstack/node-core-library': 4.0.2(@types/node@20.14.9) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.43.0': + '@microsoft/api-extractor@7.43.0(@types/node@20.14.9)': dependencies: - '@microsoft/api-extractor-model': 7.28.13 + '@microsoft/api-extractor-model': 7.28.13(@types/node@20.14.9) '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2 + '@rushstack/node-core-library': 4.0.2(@types/node@20.14.9) '@rushstack/rig-package': 0.5.2 - '@rushstack/terminal': 0.10.0 - '@rushstack/ts-command-line': 4.19.1 + '@rushstack/terminal': 0.10.0(@types/node@20.14.9) + '@rushstack/ts-command-line': 4.19.1(@types/node@20.14.9) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.8 @@ -5313,11 +5368,13 @@ snapshots: '@remix-run/router@1.17.0': {} - '@rollup/pluginutils@5.1.0': + '@rollup/pluginutils@5.1.0(rollup@4.18.0)': dependencies: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 + optionalDependencies: + rollup: 4.18.0 '@rollup/rollup-android-arm-eabi@4.18.0': optional: true @@ -5373,7 +5430,7 @@ snapshots: '@rushstack/eslint-plugin': 0.15.1(eslint@8.57.0)(typescript@5.5.2) '@rushstack/eslint-plugin-packlets': 0.9.1(eslint@8.57.0)(typescript@5.5.2) '@rushstack/eslint-plugin-security': 0.8.1(eslint@8.57.0)(typescript@5.5.2) - '@typescript-eslint/eslint-plugin': 7.5.0(@typescript-eslint/parser@7.5.0)(eslint@8.57.0)(typescript@5.5.2) + '@typescript-eslint/eslint-plugin': 7.5.0(@typescript-eslint/parser@7.5.0(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2) '@typescript-eslint/parser': 7.5.0(eslint@8.57.0)(typescript@5.5.2) '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.5.2) '@typescript-eslint/utils': 6.19.1(eslint@8.57.0)(typescript@5.5.2) @@ -5414,7 +5471,7 @@ snapshots: - supports-color - typescript - '@rushstack/node-core-library@4.0.2': + '@rushstack/node-core-library@4.0.2(@types/node@20.14.9)': dependencies: fs-extra: 7.0.1 import-lazy: 4.0.0 @@ -5422,22 +5479,26 @@ snapshots: resolve: 1.22.8 semver: 7.5.4 z-schema: 5.0.5 + optionalDependencies: + '@types/node': 20.14.9 '@rushstack/rig-package@0.5.2': dependencies: resolve: 1.22.8 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.10.0': + '@rushstack/terminal@0.10.0(@types/node@20.14.9)': dependencies: - '@rushstack/node-core-library': 4.0.2 + '@rushstack/node-core-library': 4.0.2(@types/node@20.14.9) supports-color: 8.1.1 + optionalDependencies: + '@types/node': 20.14.9 '@rushstack/tree-pattern@0.3.3': {} - '@rushstack/ts-command-line@4.19.1': + '@rushstack/ts-command-line@4.19.1(@types/node@20.14.9)': dependencies: - '@rushstack/terminal': 0.10.0 + '@rushstack/terminal': 0.10.0(@types/node@20.14.9) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -5453,7 +5514,7 @@ snapshots: '@swc/counter': 0.1.3 tslib: 2.6.3 - '@tanstack/react-virtual@3.7.0(react-dom@18.3.1)(react@18.3.1)': + '@tanstack/react-virtual@3.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/virtual-core': 3.7.0 react: 18.3.1 @@ -5472,14 +5533,28 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/react@15.0.7(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)': + '@testing-library/jest-dom@6.4.6(vitest@1.6.0(@types/node@20.14.9)(@vitest/ui@1.6.0(vitest@1.6.0))(jsdom@24.1.0))': + dependencies: + '@adobe/css-tools': 4.4.0 + '@babel/runtime': 7.24.7 + aria-query: 5.3.0 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + lodash: 4.17.21 + redent: 3.0.0 + optionalDependencies: + vitest: 1.6.0(@types/node@20.14.9)(@vitest/ui@1.6.0(vitest@1.6.0))(jsdom@24.1.0) + + '@testing-library/react@15.0.7(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 '@testing-library/dom': 10.2.0 - '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 '@theguild/remark-mermaid@0.0.5(react@18.3.1)': dependencies: @@ -5609,7 +5684,7 @@ snapshots: '@types/unist@3.0.2': {} - '@typescript-eslint/eslint-plugin@7.5.0(@typescript-eslint/parser@7.5.0)(eslint@8.57.0)(typescript@5.5.2)': + '@typescript-eslint/eslint-plugin@7.5.0(@typescript-eslint/parser@7.5.0(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2)': dependencies: '@eslint-community/regexpp': 4.10.1 '@typescript-eslint/parser': 7.5.0(eslint@8.57.0)(typescript@5.5.2) @@ -5624,6 +5699,7 @@ snapshots: natural-compare: 1.4.0 semver: 7.6.2 ts-api-utils: 1.3.0(typescript@5.5.2) + optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: - supports-color @@ -5636,6 +5712,7 @@ snapshots: '@typescript-eslint/visitor-keys': 7.5.0 debug: 4.3.5 eslint: 8.57.0 + optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: - supports-color @@ -5662,6 +5739,7 @@ snapshots: debug: 4.3.5 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.5.2) + optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: - supports-color @@ -5681,6 +5759,7 @@ snapshots: is-glob: 4.0.3 semver: 7.6.2 tsutils: 3.21.0(typescript@5.5.2) + optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: - supports-color @@ -5695,6 +5774,7 @@ snapshots: minimatch: 9.0.3 semver: 7.6.2 ts-api-utils: 1.3.0(typescript@5.5.2) + optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: - supports-color @@ -5709,6 +5789,7 @@ snapshots: minimatch: 9.0.3 semver: 7.6.2 ts-api-utils: 1.3.0(typescript@5.5.2) + optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: - supports-color @@ -5773,25 +5854,25 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react@4.3.1(vite@4.5.3)': + '@vitejs/plugin-react@4.3.1(vite@4.5.3(@types/node@20.14.9))': dependencies: '@babel/core': 7.24.7 '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.24.7) '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.24.7) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 4.5.3 + vite: 4.5.3(@types/node@20.14.9) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.3.1(vite@5.3.1)': + '@vitejs/plugin-react@4.3.1(vite@5.3.1(@types/node@20.14.9))': dependencies: '@babel/core': 7.24.7 '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.24.7) '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.24.7) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.3.1 + vite: 5.3.1(@types/node@20.14.9) transitivePeerDependencies: - supports-color @@ -5826,7 +5907,7 @@ snapshots: pathe: 1.1.2 picocolors: 1.0.1 sirv: 2.0.4 - vitest: 1.6.0(@vitest/ui@1.6.0)(jsdom@24.1.0) + vitest: 1.6.0(@types/node@20.14.9)(@vitest/ui@1.6.0(vitest@1.6.0))(jsdom@24.1.0) '@vitest/utils@1.6.0': dependencies: @@ -5871,8 +5952,9 @@ snapshots: minimatch: 9.0.5 muggle-string: 0.3.1 path-browserify: 1.0.1 - typescript: 5.5.2 vue-template-compiler: 2.7.16 + optionalDependencies: + typescript: 5.5.2 '@vue/shared@3.4.30': {} @@ -6117,6 +6199,11 @@ snapshots: escape-string-regexp: 1.0.5 supports-color: 5.5.0 + chalk@3.0.0: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -6229,6 +6316,8 @@ snapshots: crypto-js@4.2.0: {} + css.escape@1.5.1: {} + cssstyle@4.0.1: dependencies: rrweb-cssom: 0.6.0 @@ -6520,6 +6609,8 @@ snapshots: dom-accessibility-api@0.5.16: {} + dom-accessibility-api@0.6.3: {} + dompurify@3.1.5: {} eastasianwidth@0.2.0: {} @@ -6709,13 +6800,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.5.0)(eslint-plugin-import@2.25.3)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.5.0(eslint@8.57.0)(typescript@5.5.2))(eslint-plugin-import@2.25.3)(eslint@8.57.0): dependencies: debug: 4.3.5 enhanced-resolve: 5.17.0 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.5.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-import: 2.25.3(@typescript-eslint/parser@7.5.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.5.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.5.0(eslint@8.57.0)(typescript@5.5.2))(eslint-plugin-import@2.25.3)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.25.3(@typescript-eslint/parser@7.5.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.5 is-core-module: 2.14.0 @@ -6726,26 +6817,26 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.5.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.5.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.5.0(eslint@8.57.0)(typescript@5.5.2))(eslint-plugin-import@2.25.3)(eslint@8.57.0))(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 7.5.0(eslint@8.57.0)(typescript@5.5.2) debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.5.0(eslint@8.57.0)(typescript@5.5.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.5.0)(eslint-plugin-import@2.25.3)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.5.0(eslint@8.57.0)(typescript@5.5.2))(eslint-plugin-import@2.25.3)(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.25.3(@typescript-eslint/parser@7.5.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.25.3(@typescript-eslint/parser@7.5.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 7.5.0(eslint@8.57.0)(typescript@5.5.2) array-includes: 3.1.8 array.prototype.flat: 1.3.2 debug: 2.6.9 doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.5.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.5.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.5.0(eslint@8.57.0)(typescript@5.5.2))(eslint-plugin-import@2.25.3)(eslint@8.57.0))(eslint@8.57.0) has: 1.0.4 is-core-module: 2.14.0 is-glob: 4.0.3 @@ -6753,6 +6844,8 @@ snapshots: object.values: 1.2.0 resolve: 1.22.8 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.5.0(eslint@8.57.0)(typescript@5.5.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -6780,13 +6873,14 @@ snapshots: eslint-plugin-no-relative-import-paths@1.5.3: {} - eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.3.2): + eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.2): dependencies: eslint: 8.57.0 - eslint-config-prettier: 9.1.0(eslint@8.57.0) prettier: 3.3.2 prettier-linter-helpers: 1.0.0 synckit: 0.8.8 + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@8.57.0) eslint-plugin-promise@6.1.1(eslint@8.57.0): dependencies: @@ -7404,6 +7498,8 @@ snapshots: imurmurhash@0.1.4: {} + indent-string@4.0.0: {} + inflight@1.0.6: dependencies: once: 1.4.0 @@ -8310,6 +8406,8 @@ snapshots: mimic-fn@4.0.0: {} + min-indent@1.0.1: {} + minimatch@3.0.8: dependencies: brace-expansion: 1.1.11 @@ -8359,7 +8457,7 @@ snapshots: natural-compare@1.4.0: {} - next-mdx-remote@4.4.1(react-dom@18.3.1)(react@18.3.1): + next-mdx-remote@4.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@mdx-js/mdx': 2.3.0 '@mdx-js/react': 2.3.0(react@18.3.1) @@ -8370,19 +8468,19 @@ snapshots: transitivePeerDependencies: - supports-color - next-seo@6.5.0(next@14.2.4)(react-dom@18.3.1)(react@18.3.1): + next-seo@6.5.0(next@14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - next: 14.2.4(react-dom@18.3.1)(react@18.3.1) + next: 14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - next-themes@0.2.1(next@14.2.4)(react-dom@18.3.1)(react@18.3.1): + next-themes@0.2.1(next@14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - next: 14.2.4(react-dom@18.3.1)(react@18.3.1) + next: 14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - next@14.2.4(react-dom@18.3.1)(react@18.3.1): + next@14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.4 '@swc/helpers': 0.5.5 @@ -8407,9 +8505,9 @@ snapshots: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@2.13.4(next@14.2.4)(nextra@2.13.4)(react-dom@18.3.1)(react@18.3.1): + nextra-theme-docs@2.13.4(next@14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.4(next@14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@headlessui/react': 1.7.19(react-dom@18.3.1)(react@18.3.1) + '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@popperjs/core': 2.11.8 clsx: 2.1.1 escape-string-regexp: 5.0.0 @@ -8418,18 +8516,18 @@ snapshots: git-url-parse: 13.1.1 intersection-observer: 0.12.2 match-sorter: 6.3.4 - next: 14.2.4(react-dom@18.3.1)(react@18.3.1) - next-seo: 6.5.0(next@14.2.4)(react-dom@18.3.1)(react@18.3.1) - next-themes: 0.2.1(next@14.2.4)(react-dom@18.3.1)(react@18.3.1) - nextra: 2.13.4(next@14.2.4)(react-dom@18.3.1)(react@18.3.1) + next: 14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-seo: 6.5.0(next@14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-themes: 0.2.1(next@14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + nextra: 2.13.4(next@14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) scroll-into-view-if-needed: 3.1.0 zod: 3.23.8 - nextra@2.13.4(next@14.2.4)(react-dom@18.3.1)(react@18.3.1): + nextra@2.13.4(next@14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@headlessui/react': 1.7.19(react-dom@18.3.1)(react@18.3.1) + '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mdx-js/mdx': 2.3.0 '@mdx-js/react': 2.3.0(react@18.3.1) '@napi-rs/simple-git': 0.1.16 @@ -8441,8 +8539,8 @@ snapshots: gray-matter: 4.0.3 katex: 0.16.10 lodash.get: 4.4.2 - next: 14.2.4(react-dom@18.3.1)(react@18.3.1) - next-mdx-remote: 4.4.1(react-dom@18.3.1)(react@18.3.1) + next: 14.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-mdx-remote: 4.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) p-limit: 3.1.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -8665,10 +8763,12 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss-load-config@4.0.2: + postcss-load-config@4.0.2(postcss@8.4.38): dependencies: lilconfig: 3.1.2 yaml: 2.4.5 + optionalDependencies: + postcss: 8.4.38 postcss@8.4.31: dependencies: @@ -8747,7 +8847,7 @@ snapshots: react-refresh@0.14.2: {} - react-router-dom@6.24.0(react-dom@18.3.1)(react@18.3.1): + react-router-dom@6.24.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.17.0 react: 18.3.1 @@ -8776,6 +8876,11 @@ snapshots: reading-time@1.5.0: {} + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + reflect.getprototypeof@1.0.6: dependencies: call-bind: 1.0.7 @@ -9159,6 +9264,10 @@ snapshots: strip-final-newline@3.0.0: {} + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + strip-json-comments@3.1.1: {} strip-literal@2.1.0: @@ -9292,7 +9401,7 @@ snapshots: tslib@2.6.3: {} - tsup@8.1.0(typescript@5.5.2): + tsup@8.1.0(@microsoft/api-extractor@7.43.0(@types/node@20.14.9))(postcss@8.4.38)(typescript@5.5.2): dependencies: bundle-require: 4.2.1(esbuild@0.21.5) cac: 6.7.14 @@ -9302,12 +9411,15 @@ snapshots: execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.2 + postcss-load-config: 4.0.2(postcss@8.4.38) resolve-from: 5.0.0 rollup: 4.18.0 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tree-kill: 1.2.2 + optionalDependencies: + '@microsoft/api-extractor': 7.43.0(@types/node@20.14.9) + postcss: 8.4.38 typescript: 5.5.2 transitivePeerDependencies: - supports-color @@ -9560,13 +9672,13 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - vite-node@1.6.0: + vite-node@1.6.0(@types/node@20.14.9): dependencies: cac: 6.7.14 debug: 4.3.5 pathe: 1.1.2 picocolors: 1.0.1 - vite: 5.3.1 + vite: 5.3.1(@types/node@20.14.9) transitivePeerDependencies: - '@types/node' - less @@ -9577,67 +9689,69 @@ snapshots: - supports-color - terser - vite-plugin-dts@3.9.1(typescript@5.5.2)(vite@4.5.3): + vite-plugin-dts@3.9.1(@types/node@20.14.9)(rollup@4.18.0)(typescript@5.5.2)(vite@4.5.3(@types/node@20.14.9)): dependencies: - '@microsoft/api-extractor': 7.43.0 - '@rollup/pluginutils': 5.1.0 + '@microsoft/api-extractor': 7.43.0(@types/node@20.14.9) + '@rollup/pluginutils': 5.1.0(rollup@4.18.0) '@vue/language-core': 1.8.27(typescript@5.5.2) debug: 4.3.5 kolorist: 1.8.0 magic-string: 0.30.10 typescript: 5.5.2 - vite: 4.5.3 vue-tsc: 1.8.27(typescript@5.5.2) + optionalDependencies: + vite: 4.5.3(@types/node@20.14.9) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-dts@3.9.1(typescript@5.5.2)(vite@5.3.1): + vite-plugin-dts@3.9.1(@types/node@20.14.9)(rollup@4.18.0)(typescript@5.5.2)(vite@5.3.1(@types/node@20.14.9)): dependencies: - '@microsoft/api-extractor': 7.43.0 - '@rollup/pluginutils': 5.1.0 + '@microsoft/api-extractor': 7.43.0(@types/node@20.14.9) + '@rollup/pluginutils': 5.1.0(rollup@4.18.0) '@vue/language-core': 1.8.27(typescript@5.5.2) debug: 4.3.5 kolorist: 1.8.0 magic-string: 0.30.10 typescript: 5.5.2 - vite: 5.3.1 vue-tsc: 1.8.27(typescript@5.5.2) + optionalDependencies: + vite: 5.3.1(@types/node@20.14.9) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite@4.5.3: + vite@4.5.3(@types/node@20.14.9): dependencies: esbuild: 0.18.20 postcss: 8.4.38 rollup: 3.29.4 optionalDependencies: + '@types/node': 20.14.9 fsevents: 2.3.3 - vite@5.3.1: + vite@5.3.1(@types/node@20.14.9): dependencies: esbuild: 0.21.5 postcss: 8.4.38 rollup: 4.18.0 optionalDependencies: + '@types/node': 20.14.9 fsevents: 2.3.3 - vitest@1.6.0(@vitest/ui@1.6.0)(jsdom@24.1.0): + vitest@1.6.0(@types/node@20.14.9)(@vitest/ui@1.6.0(vitest@1.6.0))(jsdom@24.1.0): dependencies: '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 '@vitest/snapshot': 1.6.0 '@vitest/spy': 1.6.0 - '@vitest/ui': 1.6.0(vitest@1.6.0) '@vitest/utils': 1.6.0 acorn-walk: 8.3.3 chai: 4.4.1 debug: 4.3.5 execa: 8.0.1 - jsdom: 24.1.0 local-pkg: 0.5.0 magic-string: 0.30.10 pathe: 1.1.2 @@ -9646,9 +9760,13 @@ snapshots: strip-literal: 2.1.0 tinybench: 2.8.0 tinypool: 0.8.4 - vite: 5.3.1 - vite-node: 1.6.0 + vite: 5.3.1(@types/node@20.14.9) + vite-node: 1.6.0(@types/node@20.14.9) why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 20.14.9 + '@vitest/ui': 1.6.0(vitest@1.6.0) + jsdom: 24.1.0 transitivePeerDependencies: - less - lightningcss