diff --git a/.github/workflows/benchmark.yaml b/.github/workflows/benchmark.yaml index 6230a90..00f4e1d 100644 --- a/.github/workflows/benchmark.yaml +++ b/.github/workflows/benchmark.yaml @@ -28,13 +28,13 @@ jobs: - name: Install bun uses: oven-sh/setup-bun@v1 with: - bun-version: canary + # Cannot upgrade due to https://github.com/oven-sh/bun/issues/8314 + bun-version: 1.0.23 - name: Run run: | hyperfine --warmup 1 \ 'yarn workspace jasmine test' \ 'yarn workspace jest test' \ - 'yarn workspace vitest test' \ - 'yarn workspace vitest test --pool=vmThreads' \ - 'yarn workspace vitest test --poolOptions.threads.isolate=false' \ No newline at end of file + 'yarn workspace vitest test --poolOptions.threads.isolate=false' \ + 'yarn workspace tape test' \ No newline at end of file diff --git a/README.md b/README.md index 9077dd7..02d9c11 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,15 @@ This repo is setup to test the performance of various test runners. Specially to - Help the **Jest** team with https://github.com/facebook/jest/issues/6694. - Help the **Vitest** team with https://github.com/vitest-dev/vitest/issues/229 & https://github.com/vitest-dev/vitest/issues/579 -![](results.png?raw=true) +## Results + +### Single-thread (on GitHub Actions CI) + +![](result-single-thread.png?raw=true) + +### Multi-thread (12 core PC) + +![](result-multi-thread.png?raw=true) ## Setup @@ -19,12 +27,11 @@ Then you can run benchmarks via: ```sh hyperfine --warmup 1 \ + 'yarn workspace bun test' \ 'yarn workspace jasmine test' \ 'yarn workspace jest test' \ - 'yarn workspace vitest test' \ - 'yarn workspace vitest test --pool=vmThreads' \ - 'yarn workspace vitest test --poolOptions.threads.isolate=false' \ - 'yarn workspace bun test' + 'yarn workspace tape test' \ + 'yarn workspace vitest test --poolOptions.threads.isolate=false' ``` > [!NOTE] @@ -33,9 +40,12 @@ hyperfine --warmup 1 \ ## Suites - `jasmine`: This is our baseline, using Jasmine and happy-dom. -- `jest`: Same test suite, but running using Jest. -- `vitest`: Same test suite, but running using Vitest. NOTE: That benchmarks include vitest with the `--poolOptions.threads.isolate` setting both enabled and disabled due to [this issue](https://github.com/vitest-dev/vitest/issues/229#issuecomment-1003235680) + - *NOTE*: Jasmine doesn't support shapshot testing so those tests do a basic comparison - `bun`: Same test suite, but running using Bun. +- `jest`: Same test suite, but running using Jest. +- `tape`: Same test suite, but running using Tape and ts-node. + - *NOTE*: Tape doesn't support shapshot testing so those tests do a basic comparison +- `vitest`: Same test suite, but running using Vitest. *NOTE*: That benchmarks use `--poolOptions.threads.isolate=false` as it has the best performance (see [this comment](https://github.com/vitest-dev/vitest/issues/579#issuecomment-1946462435)) ## Results @@ -46,7 +56,7 @@ Benchmarks are run via GitHub Actions. You can check the latest run results [her - Use `hyperfine` for consistent and reproducible benchmark collection - Discard the first run (via `--warmup 1`) to let various caches build up - Use minimal configurations (ie. stock configurations) -- Tests should represent real-world scenarios (in this case, they are copies of real files used in real projects) +- Tests should represent a modern real-world scenario (in this case, they are copies of real files used in a real TypeScript React project) - Tests should be updated for each test runner's best practices and APIs to give them the best chance possible to be optimized (eg. Jasmine uses APIs like `createSpy()` whereas Jest has `jest.fn()` and Vitest has `vi.fn()`) ## Other Suites diff --git a/benchmarks/bun/package.json b/benchmarks/bun/package.json index f029fbd..f7e73de 100644 --- a/benchmarks/bun/package.json +++ b/benchmarks/bun/package.json @@ -8,16 +8,16 @@ "author": "", "license": "MIT", "dependencies": { - "@blueprintjs/icons": "4.6.3", - "@floating-ui/react-dom-interactions": "0.10.1", - "clsx": "1.2.1", + "@blueprintjs/icons": "4.16.0", + "@floating-ui/react-dom-interactions": "0.10.3", + "clsx": "2.1.0", "date-fns": "2.29.3", "framer-motion": "7.5.3", "react": "18.2.0", "react-dom": "18.2.0" }, "devDependencies": { - "@happy-dom/global-registrator": "12.10.3", - "happy-dom": "12.0.1" + "@happy-dom/global-registrator": "13.6.2", + "happy-dom": "13.6.2" } } diff --git a/benchmarks/jasmine/package.json b/benchmarks/jasmine/package.json index 178ed4d..6338581 100644 --- a/benchmarks/jasmine/package.json +++ b/benchmarks/jasmine/package.json @@ -8,18 +8,18 @@ "author": "", "license": "MIT", "dependencies": { - "@blueprintjs/icons": "4.6.3", - "@floating-ui/react-dom-interactions": "0.10.1", - "clsx": "1.2.1", + "@blueprintjs/icons": "4.16.0", + "@floating-ui/react-dom-interactions": "0.10.3", + "clsx": "2.1.0", "date-fns": "2.29.3", "framer-motion": "7.5.3", "react": "18.2.0", "react-dom": "18.2.0" }, "devDependencies": { - "@types/jasmine": "4.3.0", + "@types/jasmine": "5.1.4", "css-modules-require-hook": "4.2.3", - "happy-dom": "12.0.1", + "happy-dom": "13.6.2", "jasmine": "5.1.0", "ts-node": "10.9.2" } diff --git a/benchmarks/jasmine/spec/helpers/happydom.ts b/benchmarks/jasmine/spec/helpers/happydom.ts index ed4e92c..ecfc539 100644 --- a/benchmarks/jasmine/spec/helpers/happydom.ts +++ b/benchmarks/jasmine/spec/helpers/happydom.ts @@ -9,10 +9,7 @@ global.window = window; 'document', 'Element', 'getComputedStyle', - 'HTMLCanvasElement', 'HTMLElement', - 'HTMLInputElement', - 'navigator', 'SVGElement' ].forEach((key) => { global[key] = global.window[key]; diff --git a/benchmarks/jasmine/tests/original/StatusBadge/StatusBadge.test.tsx b/benchmarks/jasmine/tests/original/StatusBadge/StatusBadge.test.tsx index 7fc3395..4df48e0 100644 --- a/benchmarks/jasmine/tests/original/StatusBadge/StatusBadge.test.tsx +++ b/benchmarks/jasmine/tests/original/StatusBadge/StatusBadge.test.tsx @@ -5,7 +5,7 @@ import StatusBadge from '.'; describe('', () => { it('should render without failure', () => { const {asFragment} = render(); - // Jasmine doesn't support shapshot testing, so we just check for Object + // Jasmine doesn't support shapshot testing, so we just check for Object expect(asFragment()).toEqual(jasmine.any(Object)); }); }); diff --git a/benchmarks/jest/package.json b/benchmarks/jest/package.json index 812b194..979331f 100644 --- a/benchmarks/jest/package.json +++ b/benchmarks/jest/package.json @@ -8,22 +8,22 @@ "author": "", "license": "MIT", "dependencies": { - "@blueprintjs/icons": "4.6.3", - "@floating-ui/react-dom-interactions": "0.10.1", - "clsx": "1.2.1", + "@blueprintjs/icons": "4.16.0", + "@floating-ui/react-dom-interactions": "0.10.3", + "clsx": "2.1.0", "date-fns": "2.29.3", "framer-motion": "7.5.3", "react": "18.2.0", "react-dom": "18.2.0" }, "devDependencies": { - "@happy-dom/jest-environment": "12.0.1", - "@testing-library/react": "13.4.0", - "@testing-library/user-event": "14.4.3", + "@happy-dom/jest-environment": "13.6.2", + "@testing-library/react": "14.2.1", + "@testing-library/user-event": "14.5.2", "identity-obj-proxy": "3.0.0", "jest": "29.7.0", "ts-jest": "29.1.2", - "typescript": "4.8.4" + "typescript": "5.3.3" }, "jest": { "moduleNameMapper": { diff --git a/benchmarks/tape/helpers/css.ts b/benchmarks/tape/helpers/css.ts new file mode 100644 index 0000000..7a0ec3d --- /dev/null +++ b/benchmarks/tape/helpers/css.ts @@ -0,0 +1,6 @@ +import hook from 'css-modules-require-hook'; + +// Support for CSS modules +hook({ + generateScopedName: '[name]__[local]___[hash:base64:5]', +}); \ No newline at end of file diff --git a/benchmarks/tape/helpers/happydom.ts b/benchmarks/tape/helpers/happydom.ts new file mode 100644 index 0000000..ecfc539 --- /dev/null +++ b/benchmarks/tape/helpers/happydom.ts @@ -0,0 +1,16 @@ +import { Window } from 'happy-dom'; + +// Setup happy-dom +const window = new Window(); +global.window = window; + +// Register global window extensions +[ + 'document', + 'Element', + 'getComputedStyle', + 'HTMLElement', + 'SVGElement' +].forEach((key) => { + global[key] = global.window[key]; +}); \ No newline at end of file diff --git a/benchmarks/tape/helpers/wrapper.ts b/benchmarks/tape/helpers/wrapper.ts new file mode 100644 index 0000000..1f249cc --- /dev/null +++ b/benchmarks/tape/helpers/wrapper.ts @@ -0,0 +1,11 @@ +import {cleanup} from '@testing-library/react'; + +const withAsyncAndTeardown = (test) => { + return async (t) => { + t.teardown(cleanup); + await test(t); + t.end(); + }; +} + +export default withAsyncAndTeardown; \ No newline at end of file diff --git a/benchmarks/tape/package.json b/benchmarks/tape/package.json new file mode 100644 index 0000000..51651cf --- /dev/null +++ b/benchmarks/tape/package.json @@ -0,0 +1,30 @@ +{ + "name": "tape", + "version": "0.2.0", + "description": "", + "scripts": { + "test": "TZ=UTC ts-node --esm -P tsconfig.json ../../node_modules/.bin/tape -r ./helpers/css.ts -r ./helpers/happydom.ts tests/**/*.test.tsx" + }, + "author": "", + "license": "MIT", + "dependencies": { + "@blueprintjs/icons": "4.16.0", + "@floating-ui/react-dom-interactions": "0.10.3", + "clsx": "2.1.0", + "date-fns": "2.29.3", + "framer-motion": "7.5.3", + "react": "18.2.0", + "react-dom": "18.2.0" + }, + "devDependencies": { + "@testing-library/react": "14.2.1", + "@testing-library/user-event": "14.5.2", + "css-modules-require-hook": "4.2.3", + "happy-dom": "13.6.2", + "sinon": "17.0.1", + "tape": "5.7.5", + "tape-describe": "1.0.3", + "ts-node": "10.9.2", + "typescript": "5.3.3" + } +} diff --git a/benchmarks/tape/tests/.gitignore b/benchmarks/tape/tests/.gitignore new file mode 100644 index 0000000..66b5310 --- /dev/null +++ b/benchmarks/tape/tests/.gitignore @@ -0,0 +1 @@ +replica* \ No newline at end of file diff --git a/benchmarks/tape/tests/original/Alert/Alert.module.css b/benchmarks/tape/tests/original/Alert/Alert.module.css new file mode 100644 index 0000000..49bc942 --- /dev/null +++ b/benchmarks/tape/tests/original/Alert/Alert.module.css @@ -0,0 +1,60 @@ +.main { + border: 1px solid transparent; + border-radius: 8px; + display: flex; + font-size: 14px; + padding: 16px; +} + +.error { + background: var(--R50); + border-color: var(--R400); + color: var(--R400); +} + +/* stylelint-disable-next-line selector-max-type, selector-max-combinators */ +.error a, .error strong { color: inherit } + +.info { + background: var(--N50); + border-color: var(--N400); + color: var(--N400); +} + +/* stylelint-disable-next-line selector-max-type, selector-max-combinators */ +.info a, .info strong { color: inherit } + +.success { + background: var(--G50); + border-color: var(--G400); + color: var(--G400); +} + +/* stylelint-disable-next-line selector-max-type, selector-max-combinators */ +.success a, .success strong { color: inherit } + +.warning { + background: var(--Y50); + border-color: var(--Y400); + color: var(--Y500); +} + +/* stylelint-disable-next-line selector-max-type, selector-max-combinators */ +.warning a, .warning strong { color: inherit } + +.icon { + margin-right: 16px; +} + +.title { + color: inherit; + font-weight: bold; + margin: 0 0 8px; +} + +.text { + display: flex; + flex-direction: column; +} + +.children { color: var(--COLOR-GRAY-800) } \ No newline at end of file diff --git a/benchmarks/tape/tests/original/Alert/Alert.test.tsx b/benchmarks/tape/tests/original/Alert/Alert.test.tsx new file mode 100644 index 0000000..171a3da --- /dev/null +++ b/benchmarks/tape/tests/original/Alert/Alert.test.tsx @@ -0,0 +1,28 @@ +import describe from 'tape-describe'; +import Alert from '.'; +import React from 'react'; +import {render} from '@testing-library/react'; +import withAsyncAndTeardown from '../../../helpers/wrapper'; + +describe('', (test) => { + test('should render the given message', withAsyncAndTeardown((t) => { + const {getByText} = render(Hello World); + t.ok(getByText('Hello World')); + })); + + test('should render with only a title', withAsyncAndTeardown((t) => { + const {getByText} = render(); + t.ok(getByText('Hello World')); + })); + + test('should support all the different icons', withAsyncAndTeardown((t) => { + const {getByLabelText, rerender} = render(); + t.ok(getByLabelText('warning-sign')); + + rerender() + t.ok(getByLabelText('info-sign')); + + rerender() + t.ok(getByLabelText('tick-circle')); + })); +}); \ No newline at end of file diff --git a/benchmarks/tape/tests/original/Alert/Alert.tsx b/benchmarks/tape/tests/original/Alert/Alert.tsx new file mode 100644 index 0000000..e5bf66d --- /dev/null +++ b/benchmarks/tape/tests/original/Alert/Alert.tsx @@ -0,0 +1,48 @@ +import Icon, {IconNames} from '../Icon'; +import clsx from 'clsx'; +import React from 'react'; +import styles from './Alert.module.css'; + +type IntentType = 'error' | 'info' | 'success' | 'warning'; + +type PropsType = { + className?: string | null, + children?: React.ReactNode, + intent?: IntentType, + title?: string | null, +} + +const getIcon = (intent: IntentType) => { + switch (intent) { + case 'info': return IconNames.InfoSign; + case 'success': return IconNames.TickCircle; + case 'warning': return IconNames.WarningSign; + case 'error': return IconNames.Error; + } + return IconNames.Error; +}; + +const Alert = ({ + className, + children, + intent = 'error', + title, +}: PropsType) => { + const classes = clsx(styles.main, styles[intent], className); + + return ( +
+ +
+ {title ?

{title}

: null} + {children ? ( +
{children}
+ ) : null} +
+
+ ); +}; + +export default Alert; diff --git a/benchmarks/tape/tests/original/Alert/index.ts b/benchmarks/tape/tests/original/Alert/index.ts new file mode 100644 index 0000000..d2b7f86 --- /dev/null +++ b/benchmarks/tape/tests/original/Alert/index.ts @@ -0,0 +1 @@ +export {default} from './Alert'; diff --git a/benchmarks/tape/tests/original/Avatar/Avatar.module.css b/benchmarks/tape/tests/original/Avatar/Avatar.module.css new file mode 100644 index 0000000..2722b15 --- /dev/null +++ b/benchmarks/tape/tests/original/Avatar/Avatar.module.css @@ -0,0 +1,9 @@ +.main { + align-items: center; + border-radius: 100%; + display: inline-flex; + font-size: 15px; + height: 40px; + justify-content: center; + width: 40px; +} \ No newline at end of file diff --git a/benchmarks/tape/tests/original/Avatar/Avatar.test.tsx b/benchmarks/tape/tests/original/Avatar/Avatar.test.tsx new file mode 100644 index 0000000..09dc502 --- /dev/null +++ b/benchmarks/tape/tests/original/Avatar/Avatar.test.tsx @@ -0,0 +1,12 @@ +import describe from 'tape-describe'; +import Avatar from '.'; +import React from 'react'; +import {render} from '@testing-library/react'; +import withAsyncAndTeardown from '../../../helpers/wrapper'; + +describe('', (test) => { + test('should render the avatar with the initials of the title', withAsyncAndTeardown((t) => { + const {getByText} = render(); + t.ok(getByText('HW')); + })); +}); diff --git a/benchmarks/tape/tests/original/Avatar/Avatar.tsx b/benchmarks/tape/tests/original/Avatar/Avatar.tsx new file mode 100644 index 0000000..bb087e1 --- /dev/null +++ b/benchmarks/tape/tests/original/Avatar/Avatar.tsx @@ -0,0 +1,60 @@ +import clsx from 'clsx'; +import React from 'react'; +import styles from './Avatar.module.css'; + +type PropsType = { + className?: string | null, + colorKey?: SupportedColorsType | null, + title?: string | null, +} + +type SupportedColorsType = typeof SUPPORTED_COLORS[number]; + +const SUPPORTED_COLORS = [ + 'N', 'B', 'G', 'Y', 'R', 'V', 'T', 'P', 'O', +] as const; + +const stringToColorIndex = (str: string) => { + // This gives us a number between 0 and 41 + const chr = (str.length ? str.charCodeAt(0) : 0) - 49; + + // This gives us an index in our supported color range + return Math.floor(chr / (41 / SUPPORTED_COLORS.length)); +}; + +const getColor = (initials: string, colorKey?: string | null) => { + const colorIndex = stringToColorIndex(initials); + const key = colorKey || SUPPORTED_COLORS[colorIndex]; + const background = `var(--${key}100)`; + const color = `var(--${key}600)`; + return {background, color}; +}; + +const Avatar = ({ + className, + colorKey, + title, +}: PropsType) => { + const classes = clsx(styles.main, className); + const initials = title?.length ? + title + .trim() + .split(' ') + .map((word) => word[0].toUpperCase()) + .slice(0, 2) + .join('') : + null; + const {background, color} = getColor(initials || '', colorKey); + const style = {background, color}; + + return ( +
+ {initials} +
+ ); +}; + +export default Avatar; diff --git a/benchmarks/tape/tests/original/Avatar/index.ts b/benchmarks/tape/tests/original/Avatar/index.ts new file mode 100644 index 0000000..e1fdf1e --- /dev/null +++ b/benchmarks/tape/tests/original/Avatar/index.ts @@ -0,0 +1 @@ +export {default} from './Avatar'; diff --git a/benchmarks/tape/tests/original/Badge/Badge.module.css b/benchmarks/tape/tests/original/Badge/Badge.module.css new file mode 100644 index 0000000..5c4b0ea --- /dev/null +++ b/benchmarks/tape/tests/original/Badge/Badge.module.css @@ -0,0 +1,53 @@ +.main { + align-items: center; + border-radius: 4px; + display: inline-flex; + font-size: 11px; + height: 16px; + padding: 0 6px; +} + +.blue { + background: var(--B200); + color: var(--B600); +} + +.green { + background: var(--G300); + color: var(--G600); +} + +.neutral { + background: var(--N300); + color: var(--N800); +} + +.orange { + background: var(--O200); + color: var(--O600); +} + +.purple { + background: var(--P200); + color: var(--P600); +} + +.red { + background: var(--R200); + color: var(--R600); +} + +.turquoise { + background: var(--T200); + color: var(--T600); +} + +.violet { + background: var(--V200); + color: var(--V600); +} + +.yellow { + background: var(--Y200); + color: var(--Y600); +} \ No newline at end of file diff --git a/benchmarks/tape/tests/original/Badge/Badge.test.tsx b/benchmarks/tape/tests/original/Badge/Badge.test.tsx new file mode 100644 index 0000000..2f68117 --- /dev/null +++ b/benchmarks/tape/tests/original/Badge/Badge.test.tsx @@ -0,0 +1,12 @@ +import describe from 'tape-describe'; +import Badge from '.'; +import React from 'react'; +import {render} from '@testing-library/react'; +import withAsyncAndTeardown from '../../../helpers/wrapper'; + +describe('', (test) => { + test('should render the given badge', withAsyncAndTeardown((t) => { + const {getByText} = render(Hello World); + t.ok(getByText('Hello World')); + })); +}); diff --git a/benchmarks/tape/tests/original/Badge/Badge.tsx b/benchmarks/tape/tests/original/Badge/Badge.tsx new file mode 100644 index 0000000..e36e6f6 --- /dev/null +++ b/benchmarks/tape/tests/original/Badge/Badge.tsx @@ -0,0 +1,23 @@ +import clsx from 'clsx'; +import React from 'react'; +import styles from './Badge.module.css'; + +type PropsType = { + className?: string | null, + children: string, + color?: 'blue' | 'green' | 'neutral' | 'orange' | 'purple' | 'red' | 'turquoise' | 'violet' | 'yellow', +} + +const Badge = ({ + className, + children, + color = 'neutral', +}: PropsType) => ( + + {children} + +); + +export default Badge; diff --git a/benchmarks/tape/tests/original/Badge/index.ts b/benchmarks/tape/tests/original/Badge/index.ts new file mode 100644 index 0000000..1cacee3 --- /dev/null +++ b/benchmarks/tape/tests/original/Badge/index.ts @@ -0,0 +1 @@ +export {default} from './Badge'; diff --git a/benchmarks/tape/tests/original/Button/Button.module.css b/benchmarks/tape/tests/original/Button/Button.module.css new file mode 100644 index 0000000..37c4206 --- /dev/null +++ b/benchmarks/tape/tests/original/Button/Button.module.css @@ -0,0 +1,170 @@ +.main { + align-items: center; + background: transparent; + border: 1px solid transparent; + border-radius: 4px; + color: inherit; + cursor: pointer; + display: flex; + font-size: 12px; + font-weight: bold; + height: 32px; + justify-content: center; + outline: none; + padding: 0 16px; + transition: + background 150ms ease-in-out, + border-color 150ms ease-in-out, + color 150ms ease-in-out; + user-select: none; + white-space: nowrap; +} + +.iconOnly { padding: 0 8px } + +.disabled { cursor: default } + +.default { + background: var(--N0); + border-color: var(--N400); + color: var(--N700); +} + +.default:active, +.default:focus-visible, +.default:hover { + color: var(--N800); +} + +.default:focus-visible { + border-color: var(--N500); + box-shadow: 0 0 0 2px var(--B200); +} + +.default:hover { + border-color: var(--N600); +} + +.default:active { + background: var(--N100); + border-color: var(--N500); +} + +.defaultDisabled, +.defaultDisabled:focus-visible, +.defaultDisabled:hover { + border-color: var(--N300); + color: var(--N300); +} + +.primaryG { + background: var(--G400); + border-color: var(--G400); + color: var(--N0); +} + +.primaryG:focus-visible, +.primaryR:focus-visible, +.primaryV:focus-visible { + box-shadow: 0 0 0 2px var(--B200); +} + +.primaryG:focus-visible, +.primaryG:hover { + background: var(--G500); + border-color: var(--G500); +} + +.primaryG:active { + background: var(--G600); + border-color: var(--G600); +} + +.primaryV { + background: var(--V400); + border-color: var(--V400); + color: var(--N0); +} + +.primaryV:focus-visible, +.primaryV:hover { + background: var(--V500); + border-color: var(--v500); +} + +.primaryV:active { + background: var(--V600); + border-color: var(--V600); +} + +.primaryR { + background: var(--R400); + border-color: var(--R400); + color: var(--N0); +} + +.primaryR:focus-visible, +.primaryR:hover { + background: var(--R500); + border-color: var(--R500); +} + +.primaryR:active { + background: var(--R600); + border-color: var(--R600); +} + +.primaryGDisabled, +.primaryGDisabled:focus-visible, +.primaryGDisabled:hover { + background: var(--G200); + border-color: var(--G200); +} + +.primaryVDisabled, +.primaryVDisabled:focus-visible, +.primaryVDisabled:hover { + background: var(--V200); + border-color: var(--V200); +} + +.primaryRDisabled, +.primaryRDisabled:focus-visible, +.primaryRDisabled:hover { + background: var(--R200); + border-color: var(--R200); +} + +.minimal:focus-visible { + box-shadow: 0 0 0 2px var(--B200); +} + +.minimal:hover { + background: rgba(0, 0, 0, 0.1); +} + +.minimalGDisabled, +.minimalGDisabled:focus-visible, +.minimalGDisabled:hover { + background: transparent; + color: var(--N400); +} + +.iconWithText { margin-right: 8px } + +/* + * Ensures that outlines always show up on top of selected items + * when buttons are used in ToggleGroup/ToggleButton components + */ +.main:focus { z-index: 1 } + +/* + * TODO: This only works for 'minimal' appearance right now. + * Add the others when/if needed. + */ +.isSelected, +.isSelected:focus-visible, +.isSelected:hover { + background: var(--G100); + color: var(--G400); +} \ No newline at end of file diff --git a/benchmarks/tape/tests/original/Button/Button.tsx b/benchmarks/tape/tests/original/Button/Button.tsx new file mode 100644 index 0000000..accc322 --- /dev/null +++ b/benchmarks/tape/tests/original/Button/Button.tsx @@ -0,0 +1,102 @@ +import clsx from 'clsx'; +import Icon from '../Icon'; +import {type IconName} from '@blueprintjs/icons'; +import React from 'react'; +import Spinner from '../Spinner'; +import styles from './Button.module.css'; + +export type PropsType = { + appearance?: 'default' | 'minimal' | 'primary', + ariaLabel?: string, + className?: string | null, + children?: React.ReactNode, + colorKey?: 'G' | 'R' | 'V', + icon?: IconName, + isDisabled?: boolean, + isLoading?: boolean, + isSelected?: boolean, + onBlur?: (event: React.FocusEvent) => unknown, + onClick?: (event: React.MouseEvent) => unknown, + onFocus?: (event: React.FocusEvent) => unknown, + onKeyDown?: (event: React.KeyboardEvent) => unknown, + onPointerDown?: (event: React.PointerEvent) => unknown, + onPointerEnter?: (event: React.PointerEvent) => unknown, + onPointerLeave?: (event: React.PointerEvent) => unknown, + role?: 'tab', + tabIndex?: number, + type?: 'button' | 'submit', +} + +type RefType = HTMLButtonElement; + +const Button = React.forwardRef(({ + appearance = 'default', + ariaLabel, + className, + children, + colorKey = 'G', + icon, + isDisabled = false, + isLoading = false, + isSelected = false, + onBlur, + onClick, + onFocus, + onKeyDown, + onPointerDown, + onPointerEnter, + onPointerLeave, + role, + tabIndex, + type = 'button', +}, ref) => { + const classes = clsx( + styles.main, + styles[appearance], + !children && icon ? styles.iconOnly : null, + isDisabled ? styles.disabled : null, + isDisabled ? styles[`${appearance}${colorKey}Disabled`] : null, + styles[`${appearance}${colorKey}`], + isSelected ? styles.isSelected : null, + className + ); + + return ( + + ); +}); + +Button.displayName = 'Button'; + +export default Button; diff --git a/benchmarks/tape/tests/original/Button/index.ts b/benchmarks/tape/tests/original/Button/index.ts new file mode 100644 index 0000000..20cd824 --- /dev/null +++ b/benchmarks/tape/tests/original/Button/index.ts @@ -0,0 +1 @@ +export {default} from './Button'; diff --git a/benchmarks/tape/tests/original/Card/Card.module.css b/benchmarks/tape/tests/original/Card/Card.module.css new file mode 100644 index 0000000..1e03bf6 --- /dev/null +++ b/benchmarks/tape/tests/original/Card/Card.module.css @@ -0,0 +1,7 @@ +.main { + background: var(--N0); + border-radius: 8px; + box-shadow: 0 4px 8px rgba(16, 24, 64, 0.08); + display: flex; + padding: 32px; +} \ No newline at end of file diff --git a/benchmarks/tape/tests/original/Card/Card.test.tsx b/benchmarks/tape/tests/original/Card/Card.test.tsx new file mode 100644 index 0000000..cfbb3b5 --- /dev/null +++ b/benchmarks/tape/tests/original/Card/Card.test.tsx @@ -0,0 +1,12 @@ +import describe from 'tape-describe'; +import Card from '.'; +import React from 'react'; +import {render} from '@testing-library/react'; +import withAsyncAndTeardown from '../../../helpers/wrapper'; + +describe('', (test) => { + test('should render the given children', withAsyncAndTeardown((t) => { + const {getByText} = render(Hello World); + t.ok(getByText('Hello World')); + })); +}); diff --git a/benchmarks/tape/tests/original/Card/Card.tsx b/benchmarks/tape/tests/original/Card/Card.tsx new file mode 100644 index 0000000..d4f0095 --- /dev/null +++ b/benchmarks/tape/tests/original/Card/Card.tsx @@ -0,0 +1,19 @@ +import clsx from 'clsx'; +import React from 'react'; +import styles from './Card.module.css'; + +type PropsType = { + className?: string | null, + children?: React.ReactNode, +} + +const Card = ({ + className, + children, +}: PropsType) => ( +
+ {children} +
+); + +export default Card; diff --git a/benchmarks/tape/tests/original/Card/index.ts b/benchmarks/tape/tests/original/Card/index.ts new file mode 100644 index 0000000..324373e --- /dev/null +++ b/benchmarks/tape/tests/original/Card/index.ts @@ -0,0 +1 @@ +export {default} from './Card'; diff --git a/benchmarks/tape/tests/original/Checkbox/Checkbox.module.css b/benchmarks/tape/tests/original/Checkbox/Checkbox.module.css new file mode 100644 index 0000000..10c559b --- /dev/null +++ b/benchmarks/tape/tests/original/Checkbox/Checkbox.module.css @@ -0,0 +1,54 @@ +.main { + color: var(--N800); + cursor: pointer; + position: relative; +} + +.input { display: none } + +.checkbox { + align-items: center; + background: var(--N0); + border: 1px solid var(--N400); + border-radius: 4px; + display: flex; + height: 16px; + justify-content: center; + position: relative; + transition: + background 100ms ease-in-out, + border-color 100ms ease-in-out, + color 100ms ease-in-out; + width: 16px; +} + +.checkboxChecked { + background: var(--G400); + border-color: var(--G400); + color: var(--N0); +} + +/* stylelint-disable selector-max-combinators */ +.main:focus-visible .checkbox, +.main:hover .checkbox { + border-color: var(--N600); +} + +.main:active .checkbox { + border-color: var(--N500); +} + +.main:focus-visible .checkboxChecked, +.main:hover .checkboxChecked { + background: var(--G500); + border-color: var(--G500); +} + +.main:active .checkboxChecked { + background: var(--G600); + border-color: var(--G600); +} +/* stylelint-enable selector-max-combinators */ + +/* Needed to avoid layout shift when checkbox is an inline block */ +.icon { position: absolute } \ No newline at end of file diff --git a/benchmarks/tape/tests/original/Checkbox/Checkbox.test.tsx b/benchmarks/tape/tests/original/Checkbox/Checkbox.test.tsx new file mode 100644 index 0000000..0fce838 --- /dev/null +++ b/benchmarks/tape/tests/original/Checkbox/Checkbox.test.tsx @@ -0,0 +1,19 @@ +import describe from 'tape-describe'; +import Checkbox from '.'; +import React from 'react'; +import {render} from '@testing-library/react'; +import withAsyncAndTeardown from '../../../helpers/wrapper'; + +describe('', (test) => { + test('should render the checkbox', withAsyncAndTeardown((t) => { + const {getByRole} = render( {}} />); + t.ok(getByRole('checkbox')); + })); + + test('should support the indeterminate state', withAsyncAndTeardown((t) => { + const {getByLabelText} = render( + {}} /> + ); + t.ok(getByLabelText('indeterminate')); + })); +}); diff --git a/benchmarks/tape/tests/original/Checkbox/Checkbox.tsx b/benchmarks/tape/tests/original/Checkbox/Checkbox.tsx new file mode 100644 index 0000000..aeb93c0 --- /dev/null +++ b/benchmarks/tape/tests/original/Checkbox/Checkbox.tsx @@ -0,0 +1,67 @@ +import clsx from 'clsx'; +import Icon from '../Icon'; +import React from 'react'; +import styles from './Checkbox.module.css'; + +type PropsType = { + checked?: boolean, + className?: string | null, + indeterminate?: boolean, + label?: string, + onChange?: ((e: React.ChangeEvent) => unknown) | undefined, + title?: string, +} + +const getIcon = ({ + checked, + indeterminate, +}: { + checked: boolean, + indeterminate: boolean, +}) => { + if (indeterminate) return ( + + + + ); + if (checked) return ; + return null; +}; + +const Checkbox = ({ + className, + checked = false, + indeterminate = false, + label, + onChange, + title, +}: PropsType) => { + const classes = clsx(styles.main, className); + const checkboxClasses = clsx( + styles.checkbox, + checked || indeterminate ? styles.checkboxChecked : null + ); + + return ( + + ); +}; + +export default Checkbox; diff --git a/benchmarks/tape/tests/original/Checkbox/index.ts b/benchmarks/tape/tests/original/Checkbox/index.ts new file mode 100644 index 0000000..b03c7a9 --- /dev/null +++ b/benchmarks/tape/tests/original/Checkbox/index.ts @@ -0,0 +1 @@ +export {default} from './Checkbox'; diff --git a/benchmarks/tape/tests/original/Collapsible/Collapsible.module.css b/benchmarks/tape/tests/original/Collapsible/Collapsible.module.css new file mode 100644 index 0000000..3a5a53e --- /dev/null +++ b/benchmarks/tape/tests/original/Collapsible/Collapsible.module.css @@ -0,0 +1,30 @@ +.main { + display: flex; + flex-direction: column; +} + +.headerButton { + align-items: center; + background: transparent; + border: 0; + border-radius: 4px; + color: var(--N800); + cursor: pointer; + display: flex; + font-size: 14px; + font-weight: bold; + height: 32px; + justify-content: space-between; + outline: none; + padding: 0 8px; +} + +.headerButton:hover { + background: rgba(0, 0, 0, 0.1); +} + +.headerButton:focus-visible { + box-shadow: 0 0 0 2px var(--B200); +} + +.content { overflow: hidden } \ No newline at end of file diff --git a/benchmarks/tape/tests/original/Collapsible/Collapsible.test.tsx b/benchmarks/tape/tests/original/Collapsible/Collapsible.test.tsx new file mode 100644 index 0000000..ff460b4 --- /dev/null +++ b/benchmarks/tape/tests/original/Collapsible/Collapsible.test.tsx @@ -0,0 +1,31 @@ +import describe from 'tape-describe'; +import {render, waitForElementToBeRemoved} from '@testing-library/react'; +import Collapsible from '.'; +import React from 'react'; +import userEvent from '@testing-library/user-event'; +import withAsyncAndTeardown from '../../../helpers/wrapper'; + +describe('', (test) => { + test('should render the children for the element', withAsyncAndTeardown((t) => { + const {getByText} = render( + + Hello World + + ); + t.ok(getByText('Hello World')); + })); + + test('should be able to toggle the collapsible content', withAsyncAndTeardown(async (t) => { + const user = userEvent.setup(); + const {getByText, queryByText} = render( + + Hello World + + ); + t.ok(getByText('Hello World')); + + await user.click(getByText('My Title')) + + await waitForElementToBeRemoved(queryByText('Hello World')); + })); +}); diff --git a/benchmarks/tape/tests/original/Collapsible/Collapsible.tsx b/benchmarks/tape/tests/original/Collapsible/Collapsible.tsx new file mode 100644 index 0000000..da9705a --- /dev/null +++ b/benchmarks/tape/tests/original/Collapsible/Collapsible.tsx @@ -0,0 +1,62 @@ +import {AnimatePresence, motion} from 'framer-motion'; +import React, {useState} from 'react'; +import clsx from 'clsx'; +import Icon from '../Icon'; +import styles from './Collapsible.module.css'; + +type PropsType = { + className?: string | null, + children?: React.ReactNode, + contentClassName?: string, + initiallyCollapsed?: boolean, + title: React.ReactNode, +} + +const TRANSITION = { + duration: 0.5, + type: 'spring', +}; + +const VARIANTS = { + open: {height: 'auto', marginTop: 16}, + collapsed: {height: 0, marginTop: 0}, +}; + +const Collapsible = ({ + className, + children, + contentClassName, + initiallyCollapsed = false, + title, +}: PropsType) => { + const [isCollapsed, setIsCollapsed] = useState(initiallyCollapsed); + + const handleToggleClick = () => setIsCollapsed(!isCollapsed); + + return ( +
+ + + {!isCollapsed ? ( + + {children} + + ) : null} + +
+ ); +}; + +export default Collapsible; diff --git a/benchmarks/tape/tests/original/Collapsible/index.ts b/benchmarks/tape/tests/original/Collapsible/index.ts new file mode 100644 index 0000000..1d44d8e --- /dev/null +++ b/benchmarks/tape/tests/original/Collapsible/index.ts @@ -0,0 +1 @@ +export {default} from './Collapsible'; diff --git a/benchmarks/tape/tests/original/DateString/DateString.module.css b/benchmarks/tape/tests/original/DateString/DateString.module.css new file mode 100644 index 0000000..a8ede42 --- /dev/null +++ b/benchmarks/tape/tests/original/DateString/DateString.module.css @@ -0,0 +1 @@ +.main { text-transform: capitalize } \ No newline at end of file diff --git a/benchmarks/tape/tests/original/DateString/DateString.test.tsx b/benchmarks/tape/tests/original/DateString/DateString.test.tsx new file mode 100644 index 0000000..baba399 --- /dev/null +++ b/benchmarks/tape/tests/original/DateString/DateString.test.tsx @@ -0,0 +1,35 @@ +import describe from 'tape-describe'; +import DateString from '.'; +import React from 'react'; +import {render} from '@testing-library/react'; +import withAsyncAndTeardown from '../../../helpers/wrapper'; + +describe('', (test) => { + test('should render nothing if nothing is given', withAsyncAndTeardown((t) => { + const {container} = render(); + t.equal(container.innerHTML, ''); + })); + + test('should support Date objects as children', withAsyncAndTeardown((t) => { + const {getByText} = render( + {new Date(2022, 1, 1)} + ); + t.ok(getByText('2022-02-01')); + })); + + test('should support strings as children', withAsyncAndTeardown((t) => { + const {getByText} = render( + 2022-02-01T01:02:03Z + ); + t.ok(getByText('2022-02-01')); + })); + + test('should show yesterday as long form text', withAsyncAndTeardown((t) => { + const today = new Date(); + const yesterday = new Date(today.setDate(today.getDate() - 1)).toISOString(); + const {getByText} = render( + {yesterday} + ); + t.ok(getByText(/yesterday/u)); + })); +}); diff --git a/benchmarks/tape/tests/original/DateString/DateString.tsx b/benchmarks/tape/tests/original/DateString/DateString.tsx new file mode 100644 index 0000000..e95fc2a --- /dev/null +++ b/benchmarks/tape/tests/original/DateString/DateString.tsx @@ -0,0 +1,40 @@ +import buildFormatLongFn from 'date-fns/locale/_lib/buildFormatLongFn'; +import type {FormatLong} from 'date-fns/locale/types'; +import {formatRelative} from 'date-fns'; +import React from 'react'; +import styles from './DateString.module.css'; +import usLocale from 'date-fns/locale/en-US'; + +type PropsType = { + children?: Date | string | null, +} + +const DateString = ({children}: PropsType) => { + if (!children) return null; + + const locale = { + ...usLocale, + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + formatLong: { + ...usLocale.formatLong, + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + date: buildFormatLongFn({ + formats: { + full: 'EEEE, MMMM do, y', + long: 'MMMM do, y', + medium: 'MMM d, y', + short: 'yyyy-MM-dd', + }, + defaultWidth: 'full', + }) as unknown, + } as FormatLong, + }; + + return ( + + {formatRelative(new Date(children), new Date(), {locale})} + + ); +}; + +export default DateString; diff --git a/benchmarks/tape/tests/original/DateString/index.ts b/benchmarks/tape/tests/original/DateString/index.ts new file mode 100644 index 0000000..aac16ec --- /dev/null +++ b/benchmarks/tape/tests/original/DateString/index.ts @@ -0,0 +1 @@ +export {default} from './DateString'; diff --git a/benchmarks/tape/tests/original/Icon/Icon.module.css b/benchmarks/tape/tests/original/Icon/Icon.module.css new file mode 100644 index 0000000..dd0a0ee --- /dev/null +++ b/benchmarks/tape/tests/original/Icon/Icon.module.css @@ -0,0 +1 @@ +.main { fill: currentColor } \ No newline at end of file diff --git a/benchmarks/tape/tests/original/Icon/Icon.tsx b/benchmarks/tape/tests/original/Icon/Icon.tsx new file mode 100644 index 0000000..252ddf9 --- /dev/null +++ b/benchmarks/tape/tests/original/Icon/Icon.tsx @@ -0,0 +1,48 @@ +import {type IconName, iconNameToPathsRecordKey, IconSvgPaths16, IconSvgPaths20} from '@blueprintjs/icons'; +import clsx from 'clsx'; +import React from 'react'; +import styles from './Icon.module.css'; + +type PropsType = { + className?: string | null, + name: IconName, + size?: number, +} + +type RefType = SVGSVGElement; + +const renderSvgPaths = (pixelGridSize: 16 | 20, name: IconName) => { + const svgPathsRecord = pixelGridSize === 16 ? IconSvgPaths16 : IconSvgPaths20; + const paths = svgPathsRecord[iconNameToPathsRecordKey(name)]; + return paths.map((path, i) => ( + + )); +}; + +const Icon = React.forwardRef(({ + className, + name, + size = 16, +}, ref) => { + const pixelGridSize = size >= 20 ? 20 : 16; + const paths = renderSvgPaths(pixelGridSize, name); + const classes = clsx(styles.main, className); + const viewBox = `0 0 ${pixelGridSize} ${pixelGridSize}`; + + return ( + + {paths} + + ); +}); + +Icon.displayName = 'Icon'; + +export default Icon; diff --git a/benchmarks/tape/tests/original/Icon/index.ts b/benchmarks/tape/tests/original/Icon/index.ts new file mode 100644 index 0000000..ea4b464 --- /dev/null +++ b/benchmarks/tape/tests/original/Icon/index.ts @@ -0,0 +1,2 @@ +export {default} from './Icon'; +export {IconNames} from '@blueprintjs/icons'; diff --git a/benchmarks/tape/tests/original/Pagination/Pagination.module.css b/benchmarks/tape/tests/original/Pagination/Pagination.module.css new file mode 100644 index 0000000..75a1e1f --- /dev/null +++ b/benchmarks/tape/tests/original/Pagination/Pagination.module.css @@ -0,0 +1,12 @@ +.main { + align-items: center; + display: flex; + gap: 4px; +} + +.ellipsis { + align-items: center; + display: flex; + height: 32px; + justify-content: center; +} \ No newline at end of file diff --git a/benchmarks/tape/tests/original/Pagination/Pagination.test.tsx b/benchmarks/tape/tests/original/Pagination/Pagination.test.tsx new file mode 100644 index 0000000..bb60e64 --- /dev/null +++ b/benchmarks/tape/tests/original/Pagination/Pagination.test.tsx @@ -0,0 +1,61 @@ +import describe from 'tape-describe'; +import Pagination from '.'; +import React from 'react'; +import {render} from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import sinon from 'sinon'; +import withAsyncAndTeardown from '../../../helpers/wrapper'; + +describe('', (test) => { + const DEFAULT_PROPS = { + onNextPage: () => {}, + onPageChange: () => {}, + onPreviousPage: () => {}, + } + + test('should render a button for each page', withAsyncAndTeardown((t) => { + const {getByText} = render( + + ); + t.ok(getByText(1)); + t.ok(getByText(2)); + t.ok(getByText(3)); + t.ok(getByText(4)); + t.ok(getByText(5)); + })); + + test('should render two ellipses if current page is far from both ends', withAsyncAndTeardown((t) => { + const {getAllByText} = render( + + ); + t.equal(getAllByText('...').length, 2); + })); + + test('should render an ellipsis if current page is far the end', withAsyncAndTeardown((t) => { + const {getAllByText} = render( + + ); + t.equal(getAllByText('...').length, 1); + })); + + test('should render an ellipsis if current page is far the start', withAsyncAndTeardown((t) => { + const {getAllByText} = render( + + ); + t.equal(getAllByText('...').length, 1); + })); + + test('should navigate to the page when clicking on that specific page', withAsyncAndTeardown(async (t) => { + const onPageChange = sinon.fake(); + const user = userEvent.setup() + const {getByText} = render( + + ); + await user.click(getByText(2)); + t.ok(onPageChange.calledWith(2)); + })); +}); diff --git a/benchmarks/tape/tests/original/Pagination/Pagination.tsx b/benchmarks/tape/tests/original/Pagination/Pagination.tsx new file mode 100644 index 0000000..7e6e22c --- /dev/null +++ b/benchmarks/tape/tests/original/Pagination/Pagination.tsx @@ -0,0 +1,84 @@ +import Button from '../Button'; +import clsx from 'clsx'; +import React from 'react'; +import styles from './Pagination.module.css'; + +type PropsType = { + className?: string | null, + onNextPage: () => unknown, + onPageChange: (page: number) => unknown, + onPreviousPage: () => unknown, + page: number, + totalPages: number, +} + +const MAX_OPTIONS_SHOWN = 7; + +const range = (start: number, stop: number) => { + const output = [] + for (let i = start; i <= stop; i++) { + output.push(i) + } + return output +} + +const getPaginationButtonContent = ({ page, totalPages }: { + page: number, + totalPages: number, +}): Array => { + if (totalPages <= MAX_OPTIONS_SHOWN) { + return range(1, totalPages) + } + + if (totalPages > MAX_OPTIONS_SHOWN && page <= 4) { + return [...range(1, 5), '...', totalPages] + } + + if (totalPages - page < 4) { + return [1, '...', ...range(totalPages - 4, totalPages)] + } + + return [1, '...', ...range(page - 1, page + 1), '...', totalPages] +} + +const Pagination = ({ + className, + onNextPage, + onPageChange, + onPreviousPage, + page, + totalPages, +}: PropsType) => { + const isPrevEnabled = page > 1; + const isNextEnabled = page < totalPages; + + return ( +
+ + ) + ))} +
+ ); +}; + +export default Pagination; diff --git a/benchmarks/tape/tests/original/Pagination/index.ts b/benchmarks/tape/tests/original/Pagination/index.ts new file mode 100644 index 0000000..c7f7668 --- /dev/null +++ b/benchmarks/tape/tests/original/Pagination/index.ts @@ -0,0 +1 @@ +export {default} from './Pagination'; diff --git a/benchmarks/tape/tests/original/Spinner/Spinner.module.css b/benchmarks/tape/tests/original/Spinner/Spinner.module.css new file mode 100644 index 0000000..0d609f2 --- /dev/null +++ b/benchmarks/tape/tests/original/Spinner/Spinner.module.css @@ -0,0 +1,39 @@ +@keyframes spinner { + 0% { + transform: rotate(0) + } + + 100% { + transform: rotate(360deg) + } +} + +@keyframes spinnerCircle { + 0% { + stroke-dashoffset: 600 + } + + 100% { + stroke-dashoffset: 0 + } +} + +.main { display: inline-flex } + +.default { color: rgba(67, 90, 111, 0.47) } +.white { color: rgba(239, 242, 245, 0.87) } + +.svg { + animation: 2s linear 0s infinite normal none running spinner; +} + +.circle { + animation: spinnerCircle 1.6s cubic-bezier(0.4, 0.15, 0.6, 0.85) infinite; + fill: transparent; + stroke: currentColor; + stroke-dasharray: 300; + stroke-dashoffset: 600; + stroke-linecap: round; + stroke-miterlimit: 10; + stroke-width: 12; +} \ No newline at end of file diff --git a/benchmarks/tape/tests/original/Spinner/Spinner.test.tsx b/benchmarks/tape/tests/original/Spinner/Spinner.test.tsx new file mode 100644 index 0000000..ef43465 --- /dev/null +++ b/benchmarks/tape/tests/original/Spinner/Spinner.test.tsx @@ -0,0 +1,12 @@ +import describe from 'tape-describe'; +import Spinner from '.'; +import React from 'react'; +import {render} from '@testing-library/react'; +import withAsyncAndTeardown from '../../../helpers/wrapper'; + +describe('', (test) => { + test('should render a spinner image', withAsyncAndTeardown((t) => { + const {getByRole} = render(); + t.ok(getByRole('img')); + })); +}); diff --git a/benchmarks/tape/tests/original/Spinner/Spinner.tsx b/benchmarks/tape/tests/original/Spinner/Spinner.tsx new file mode 100644 index 0000000..8511adb --- /dev/null +++ b/benchmarks/tape/tests/original/Spinner/Spinner.tsx @@ -0,0 +1,45 @@ +import clsx from 'clsx'; +import React from 'react'; +import styles from './Spinner.module.css'; + +type PropsType = { + className?: string | null, + color?: 'default' | 'white', + size?: number, +} + +const Spinner = ({ + className, + color = 'default', + size = 16, +}: PropsType) => { + const style = { + height: size, + width: size, + }; + + const classes = clsx( + styles.main, + styles[color], + className + ); + + return ( +
+ + + +
+ ); +}; + +export default Spinner; diff --git a/benchmarks/tape/tests/original/Spinner/index.ts b/benchmarks/tape/tests/original/Spinner/index.ts new file mode 100644 index 0000000..e3881ab --- /dev/null +++ b/benchmarks/tape/tests/original/Spinner/index.ts @@ -0,0 +1 @@ +export {default} from './Spinner'; diff --git a/benchmarks/tape/tests/original/StatusBadge/StatusBadge.test.tsx b/benchmarks/tape/tests/original/StatusBadge/StatusBadge.test.tsx new file mode 100644 index 0000000..2c9b5ce --- /dev/null +++ b/benchmarks/tape/tests/original/StatusBadge/StatusBadge.test.tsx @@ -0,0 +1,13 @@ +import describe from 'tape-describe'; +import React from 'react'; +import {render} from '@testing-library/react'; +import StatusBadge from '.'; +import withAsyncAndTeardown from '../../../helpers/wrapper'; + +describe('', (test) => { + test('should render without failure', withAsyncAndTeardown((t) => { + const {asFragment} = render(); + // Tape doesn't support shapshot testing, so we just check for Object + t.equal(typeof asFragment(), 'object'); + })); +}); diff --git a/benchmarks/tape/tests/original/StatusBadge/StatusBadge.tsx b/benchmarks/tape/tests/original/StatusBadge/StatusBadge.tsx new file mode 100644 index 0000000..72b5a9c --- /dev/null +++ b/benchmarks/tape/tests/original/StatusBadge/StatusBadge.tsx @@ -0,0 +1,25 @@ +import Badge from '../Badge'; +import React from 'react'; + +type PropsType = { + status: 'DRAFTED' | 'COMPLETED', +}; + +const STATUSES = [ + {color: 'green' as const, value: 'DRAFTED'}, + {color: 'orange' as const, value: 'COMPLETED'} +] + +const StatusBadge = ({ + status, +}: PropsType) => { + const record = STATUSES.find(({value}) => value === status); + + return ( + + {status} + + ); +}; + +export default StatusBadge; diff --git a/benchmarks/tape/tests/original/StatusBadge/index.ts b/benchmarks/tape/tests/original/StatusBadge/index.ts new file mode 100644 index 0000000..ce69851 --- /dev/null +++ b/benchmarks/tape/tests/original/StatusBadge/index.ts @@ -0,0 +1 @@ +export {default} from './StatusBadge'; diff --git a/benchmarks/tape/tests/original/WithTooltip/WithTooltip.module.css b/benchmarks/tape/tests/original/WithTooltip/WithTooltip.module.css new file mode 100644 index 0000000..f83de95 --- /dev/null +++ b/benchmarks/tape/tests/original/WithTooltip/WithTooltip.module.css @@ -0,0 +1,25 @@ +.main { + background: var(--N900); + border-radius: 4px; + box-shadow: + rgba(67, 90, 111, 0) 0 0 1px, + rgba(67, 90, 111, 0) 0 8px 10px -4px; + color: var(--N100); + font-size: 12px; + max-width: 320px; + min-height: 16px; + padding: 8px; + pointer-events: none; + position: relative; + text-align: center; + user-select: none; + z-index: 1000; +} + +.arrow { + background: var(--N900); + height: 8px; + position: absolute; + transform: rotate(45deg); + width: 8px; +} \ No newline at end of file diff --git a/benchmarks/tape/tests/original/WithTooltip/WithTooltip.test.tsx b/benchmarks/tape/tests/original/WithTooltip/WithTooltip.test.tsx new file mode 100644 index 0000000..6be756f --- /dev/null +++ b/benchmarks/tape/tests/original/WithTooltip/WithTooltip.test.tsx @@ -0,0 +1,15 @@ +import describe from 'tape-describe'; +import React from 'react'; +import {render} from '@testing-library/react'; +import WithTooltip from '.'; +import withAsyncAndTeardown from '../../../helpers/wrapper'; + +describe('', (test) => { + test('should render render nothing if no tooltip was given', withAsyncAndTeardown((t) => { + const {asFragment} = render( + Howdy + ); + // Tape doesn't support shapshot testing, so we just check for Object + t.equal(typeof asFragment(), 'object'); + })); +}); diff --git a/benchmarks/tape/tests/original/WithTooltip/WithTooltip.tsx b/benchmarks/tape/tests/original/WithTooltip/WithTooltip.tsx new file mode 100644 index 0000000..e80f24d --- /dev/null +++ b/benchmarks/tape/tests/original/WithTooltip/WithTooltip.tsx @@ -0,0 +1,165 @@ +/* eslint-disable react/jsx-props-no-spreading */ + +import {AnimatePresence, motion} from 'framer-motion'; +import { + arrow, + autoPlacement, + autoUpdate, + FloatingPortal, + offset, + shift, + useDismiss, + useFloating, + useHover, + useInteractions, + useRole, +} from '@floating-ui/react-dom-interactions'; +import type {Coords, Placement} from '@floating-ui/react-dom-interactions'; +import React, {cloneElement, forwardRef, useRef, useState} from 'react'; +import clsx from 'clsx'; +import styles from './WithTooltip.module.css'; + +type PropsType = { + children: JSX.Element, + // Force placement + placement?: Placement, + // This is the body of the tooltip + tooltip?: React.ReactNode | null, +}; + +const ARROW_SIZE = 4; + +const getArrowStyle = (arrow: Partial | undefined, placement: Placement) => { + const arrowX = arrow?.x || 0; + const arrowY = arrow?.y || 0; + + switch (placement) { + case 'left': + return { + right: arrowX - ARROW_SIZE, + top: arrowY, + }; + case 'right': + return { + left: arrowX - ARROW_SIZE, + top: arrowY, + }; + case 'bottom': + return { + left: arrowX, + top: arrowY - ARROW_SIZE, + }; + default: + return { + left: arrowX, + bottom: arrowY - ARROW_SIZE, + }; + } +}; + +const WithTooltip = forwardRef(({ + children, + placement: forcedPlacement, + tooltip, + ...parentProps +}, parentRef) => { + const [isOpen, setIsOpen] = useState(false); + const arrowRef = useRef(null); + + const { + context, + floating, + placement: calculatedPlacement, + reference, + strategy, + x, + y, + middlewareData: md, + } = useFloating({ + middleware: [ + offset(8), + autoPlacement({ + allowedPlacements: forcedPlacement ? + [forcedPlacement] : + ['top', 'bottom'], + }), + shift({padding: 8}), + arrow({element: arrowRef, padding: 8}), + ], + onOpenChange: setIsOpen, + open: isOpen, + whileElementsMounted: autoUpdate, + }); + + const placement = forcedPlacement ? forcedPlacement : calculatedPlacement; + + const ref = reference; + + const {getReferenceProps, getFloatingProps} = useInteractions([ + // TODO: Form elements are auto-focused in the app for some reason. + // Until we can figure out, keep this off. + // useFocus(context), + useHover(context, {move: false}), + useRole(context, {role: 'tooltip'}), + useDismiss(context, {referencePress: true}), + ]); + + const arrowStyle = getArrowStyle(md.arrow, placement); + // eslint-disable-next-line no-nested-ternary + const translateY = placement === 'bottom' ? 10 : placement === 'top' ? -10 : 0; + // eslint-disable-next-line no-nested-ternary + const translateX = placement === 'right' ? 10 : placement === 'left' ? -10 : 0; + + return ( + <> + {cloneElement( + children, + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + getReferenceProps({ + ref, + ...children.props, + ...parentProps, + onKeyDown: (event) => { + // Dismiss if pressing Spacebar or Enter + if (event.keyCode === 32 || event.keyCode === 13) { + setIsOpen(false); + } + }, + }) + )} + + {isOpen && tooltip != null ? ( + + + {tooltip} +
+ + + ) : null} + + + ); +}); + +WithTooltip.displayName = 'WithTooltip'; + +export default WithTooltip; diff --git a/benchmarks/tape/tests/original/WithTooltip/index.ts b/benchmarks/tape/tests/original/WithTooltip/index.ts new file mode 100644 index 0000000..84ad64f --- /dev/null +++ b/benchmarks/tape/tests/original/WithTooltip/index.ts @@ -0,0 +1 @@ +export {default} from './WithTooltip'; diff --git a/benchmarks/tape/tsconfig.json b/benchmarks/tape/tsconfig.json new file mode 100644 index 0000000..96ae5b8 --- /dev/null +++ b/benchmarks/tape/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react" + }, + "ts-node": { + "transpileOnly": true + } +} \ No newline at end of file diff --git a/benchmarks/vitest/package.json b/benchmarks/vitest/package.json index 2fd047c..9ab6fa5 100644 --- a/benchmarks/vitest/package.json +++ b/benchmarks/vitest/package.json @@ -8,18 +8,18 @@ "author": "", "license": "MIT", "dependencies": { - "@blueprintjs/icons": "4.6.3", - "@floating-ui/react-dom-interactions": "0.10.1", - "clsx": "1.2.1", + "@blueprintjs/icons": "4.16.0", + "@floating-ui/react-dom-interactions": "0.10.3", + "clsx": "2.1.0", "date-fns": "2.29.3", "framer-motion": "7.5.3", "react": "18.2.0", "react-dom": "18.2.0" }, "devDependencies": { - "@testing-library/react": "13.4.0", - "@testing-library/user-event": "14.4.3", - "happy-dom": "12.0.1", - "vitest": "1.3.1" + "@testing-library/react": "14.2.1", + "@testing-library/user-event": "14.5.2", + "happy-dom": "13.6.2", + "vitest": "1.1.3" } } diff --git a/bun.lockb b/bun.lockb index cac10e0..0a3a179 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/result-multi-thread.png b/result-multi-thread.png new file mode 100644 index 0000000..c5d7e16 Binary files /dev/null and b/result-multi-thread.png differ diff --git a/result-single-thread.png b/result-single-thread.png new file mode 100644 index 0000000..748b232 Binary files /dev/null and b/result-single-thread.png differ diff --git a/results.png b/results.png deleted file mode 100644 index 7dea0a5..0000000 Binary files a/results.png and /dev/null differ diff --git a/yarn.lock b/yarn.lock index 1a3b127..462511e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -417,14 +417,14 @@ __metadata: languageName: node linkType: hard -"@blueprintjs/icons@npm:4.6.3": - version: 4.6.3 - resolution: "@blueprintjs/icons@npm:4.6.3" +"@blueprintjs/icons@npm:4.16.0": + version: 4.16.0 + resolution: "@blueprintjs/icons@npm:4.16.0" dependencies: change-case: "npm:^4.1.2" - classnames: "npm:^2.3.2" - tslib: "npm:~2.3.1" - checksum: 10c0/f8e29d6ac8afb94fef79d100eb6e074b1b3b2f6e0d3f44107ddfd539a2f7c3c2e9b40f726ff829bd17e5477fecea77e61c63118e30f54a68a55c0c29b4414481 + classnames: "npm:^2.3.1" + tslib: "npm:~2.5.0" + checksum: 10c0/12d7bd545966058f86c2f5b30c7d3758182a4d351af2c406bb0533f0fe78b14ed3cd1cf6c3c5b832e00f59e8dafe646ab2194d8a1e1e7425cf4719e34c7c9613 languageName: node linkType: hard @@ -633,16 +633,16 @@ __metadata: languageName: node linkType: hard -"@floating-ui/react-dom-interactions@npm:0.10.1": - version: 0.10.1 - resolution: "@floating-ui/react-dom-interactions@npm:0.10.1" +"@floating-ui/react-dom-interactions@npm:0.10.3": + version: 0.10.3 + resolution: "@floating-ui/react-dom-interactions@npm:0.10.3" dependencies: "@floating-ui/react-dom": "npm:^1.0.0" aria-hidden: "npm:^1.1.3" peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 10c0/8780915a37b338a21f88359a0b14b54fd50cd63b77e1a24ae6cd3689790ca07cdc06b675cf066de52da8b17dc00fbfabb967e5446cb9dd1d64b9ac68f4d899c5 + checksum: 10c0/01e4dbb93bde171bea173fe4d1690f1945889931df8c8e4dc0b64c3591c1c2ab169b3eee6b1e640778d3fafe12fa7b25b463ffe8624101c9f4c75280f2627254 languageName: node linkType: hard @@ -665,26 +665,26 @@ __metadata: languageName: node linkType: hard -"@happy-dom/global-registrator@npm:12.10.3": - version: 12.10.3 - resolution: "@happy-dom/global-registrator@npm:12.10.3" +"@happy-dom/global-registrator@npm:13.6.2": + version: 13.6.2 + resolution: "@happy-dom/global-registrator@npm:13.6.2" dependencies: - happy-dom: "npm:12.10.3" - checksum: 10c0/974fc27227a5f05a19ba32743ee4a4c985afa05e8290fab779c7acd22bff06b65bb53709fd7fd2405750c52f9d8cbe8fe727297f5cb5073541d81cba62313605 + happy-dom: "npm:^13.6.2" + checksum: 10c0/5e075b583988a2c0f7c78fc00d6a9a2adfe25010b070ce1d2dfd57138a83ff6fcc077849c715a0bf48b1509f0412eddf6105ec7326d58df00687db145dbd50af languageName: node linkType: hard -"@happy-dom/jest-environment@npm:12.0.1": - version: 12.0.1 - resolution: "@happy-dom/jest-environment@npm:12.0.1" +"@happy-dom/jest-environment@npm:13.6.2": + version: 13.6.2 + resolution: "@happy-dom/jest-environment@npm:13.6.2" dependencies: "@jest/environment": "npm:^29.4.0" "@jest/fake-timers": "npm:^29.4.0" "@jest/types": "npm:^29.4.0" - happy-dom: "npm:12.0.1" + happy-dom: "npm:^13.6.2" jest-mock: "npm:^29.4.0" jest-util: "npm:^29.4.0" - checksum: 10c0/643066f5e854b5f368d63d0441aa644af0c1150ea6a7d83f0e82470bec40f3a4e43a4c9577bdab53f1caeae475ba82551eb19af7722207839a3ffb434bfd9d48 + checksum: 10c0/e0e8af3b4e1100bc72584cfb43f35f3d5cd0b5a07da7723b7f3e4564a48b117e2e136b45db5365efb761bbe9023bf2a3113a287ae61bb39d54c17ca30c3f4b1f languageName: node linkType: hard @@ -1004,6 +1004,24 @@ __metadata: languageName: node linkType: hard +"@ljharb/resumer@npm:^0.1.2": + version: 0.1.2 + resolution: "@ljharb/resumer@npm:0.1.2" + dependencies: + "@ljharb/through": "npm:^2.3.12" + checksum: 10c0/a350fc449a4796d8d89c8ab8ddd34569fabd11a6b9e9df7b65126ca41f0c4cca27f952f080856ec91d9e8ea496b105bab4c888b8c222bfa185a56ae831433496 + languageName: node + linkType: hard + +"@ljharb/through@npm:^2.3.12": + version: 2.3.12 + resolution: "@ljharb/through@npm:2.3.12" + dependencies: + call-bind: "npm:^1.0.5" + checksum: 10c0/7560aaef7b6ef88c16783ffde37278e2177c7f0f5427400059a8a7687b144dc711bf5b2347ab27e858a29f25e4b868d77c915c9614bc399b82b8123430614653 + languageName: node + linkType: hard + "@motionone/animation@npm:^10.13.1": version: 10.17.0 resolution: "@motionone/animation@npm:10.17.0" @@ -1196,6 +1214,15 @@ __metadata: languageName: node linkType: hard +"@sinonjs/commons@npm:^2.0.0": + version: 2.0.0 + resolution: "@sinonjs/commons@npm:2.0.0" + dependencies: + type-detect: "npm:4.0.8" + checksum: 10c0/babe3fdfc7dfb810f6918f2ae055032a1c7c18910595f1c6bfda87bb1737c1a57268d4ca78c3d8ad2fa4aae99ff79796fad76be735a5a38ab763c0b3cfad1ae7 + languageName: node + linkType: hard + "@sinonjs/commons@npm:^3.0.0": version: 3.0.1 resolution: "@sinonjs/commons@npm:3.0.1" @@ -1214,9 +1241,36 @@ __metadata: languageName: node linkType: hard -"@testing-library/dom@npm:^8.5.0": - version: 8.20.1 - resolution: "@testing-library/dom@npm:8.20.1" +"@sinonjs/fake-timers@npm:^11.2.2": + version: 11.2.2 + resolution: "@sinonjs/fake-timers@npm:11.2.2" + dependencies: + "@sinonjs/commons": "npm:^3.0.0" + checksum: 10c0/a4218efa6fdafda622d02d4c0a6ab7df3641cb038bb0b14f0a3ee56f50c95aab4f1ab2d7798ce928b40c6fc1839465a558c9393a77e4dca879e1b2f8d60d8136 + languageName: node + linkType: hard + +"@sinonjs/samsam@npm:^8.0.0": + version: 8.0.0 + resolution: "@sinonjs/samsam@npm:8.0.0" + dependencies: + "@sinonjs/commons": "npm:^2.0.0" + lodash.get: "npm:^4.4.2" + type-detect: "npm:^4.0.8" + checksum: 10c0/c1654ad72ecd9efd4a57d756c492c1c17a197c3138da57b75ba1729562001ed1b3b9c656cce1bd1d91640bc86eb4185a72eced528d176fff09a3a01de28cdcc6 + languageName: node + linkType: hard + +"@sinonjs/text-encoding@npm:^0.7.2": + version: 0.7.2 + resolution: "@sinonjs/text-encoding@npm:0.7.2" + checksum: 10c0/583a45bf3643169e313ff9d4395aff28b0c4f330d3697e252c3effc13d4303ee30f83df542732c1a68617720e4ea6fc08d48a3d9151c9b354a7fc356a8e9b162 + languageName: node + linkType: hard + +"@testing-library/dom@npm:^9.0.0": + version: 9.3.4 + resolution: "@testing-library/dom@npm:9.3.4" dependencies: "@babel/code-frame": "npm:^7.10.4" "@babel/runtime": "npm:^7.12.5" @@ -1226,30 +1280,30 @@ __metadata: dom-accessibility-api: "npm:^0.5.9" lz-string: "npm:^1.5.0" pretty-format: "npm:^27.0.2" - checksum: 10c0/614013756706467f2a7f3f693c18377048c210ec809884f0f9be866f7d865d075805ad15f5d100e8a699467fdde09085bf79e23a00ea0a6ab001d9583ef15e5d + checksum: 10c0/147da340e8199d7f98f3a4ad8aa22ed55b914b83957efa5eb22bfea021a979ebe5a5182afa9c1e5b7a5f99a7f6744a5a4d9325ae46ec3b33b5a15aed8750d794 languageName: node linkType: hard -"@testing-library/react@npm:13.4.0": - version: 13.4.0 - resolution: "@testing-library/react@npm:13.4.0" +"@testing-library/react@npm:14.2.1": + version: 14.2.1 + resolution: "@testing-library/react@npm:14.2.1" dependencies: "@babel/runtime": "npm:^7.12.5" - "@testing-library/dom": "npm:^8.5.0" + "@testing-library/dom": "npm:^9.0.0" "@types/react-dom": "npm:^18.0.0" peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - checksum: 10c0/371bf982dd0deb27da004f368b06904353eac0f23f9c08ff0f24443c3f51a6d647009e366034417565d2484c40f1c7eff74413738abf4ec55209da9bd3253b0e + checksum: 10c0/83b35cf8bf5640f1b63b32223ebc75799dc1a8e034d819120b26838fba0b0ab10bdbe6ad07dd8ae8287365f2b0c52dc9892a6fa11bb24d3e63ad97dfb7f2f296 languageName: node linkType: hard -"@testing-library/user-event@npm:14.4.3": - version: 14.4.3 - resolution: "@testing-library/user-event@npm:14.4.3" +"@testing-library/user-event@npm:14.5.2": + version: 14.5.2 + resolution: "@testing-library/user-event@npm:14.5.2" peerDependencies: "@testing-library/dom": ">=7.21.4" - checksum: 10c0/28e1e4ed2fdaa9486e203c6789386be228e305abd3fa41f38c828af415fd4a4e80f4de88de0e502ff11c4b4926f221b874a2a45bcc8170d30714e12dad2c1bd0 + checksum: 10c0/68a0c2aa28a3c8e6eb05cafee29705438d7d8a9427423ce5064d44f19c29e89b5636de46dd2f28620fb10abba75c67130185bbc3aa23ac1163a227a5f36641e1 languageName: node linkType: hard @@ -1370,10 +1424,10 @@ __metadata: languageName: node linkType: hard -"@types/jasmine@npm:4.3.0": - version: 4.3.0 - resolution: "@types/jasmine@npm:4.3.0" - checksum: 10c0/6618059a559546e66537c085a2a75b096b2913f93deaf6b2c1586314836ecc0626968b395e0d2afb73f19869ae87a612e83648cbfd1c57ba28f1170e19d78978 +"@types/jasmine@npm:5.1.4": + version: 5.1.4 + resolution: "@types/jasmine@npm:5.1.4" + checksum: 10c0/4b8d27182e62f5003db1f1f174a810ace704e411cbfd0bc41edbaacf307246aec1f9bd20812846700198fc881268834ffde1d5301f819b1ba7caac9662534ceb languageName: node linkType: hard @@ -1443,57 +1497,57 @@ __metadata: languageName: node linkType: hard -"@vitest/expect@npm:1.3.1": - version: 1.3.1 - resolution: "@vitest/expect@npm:1.3.1" +"@vitest/expect@npm:1.1.3": + version: 1.1.3 + resolution: "@vitest/expect@npm:1.1.3" dependencies: - "@vitest/spy": "npm:1.3.1" - "@vitest/utils": "npm:1.3.1" + "@vitest/spy": "npm:1.1.3" + "@vitest/utils": "npm:1.1.3" chai: "npm:^4.3.10" - checksum: 10c0/ea66a1e912d896a481a27631b68089b885af7e8ed62ba8aaa119c37a9beafe6c094fd672775a20e6e23460af66e294f9ca259e6e0562708d1b7724eaaf53c7bb + checksum: 10c0/fe5c9eade516a754efc26d4b6378a250f0c3b668fa15b3e6b6042190b64a65c4459b7fd67bfca72fb1fbf215feb838b68da4ab224a2a10137d8828ca6af70516 languageName: node linkType: hard -"@vitest/runner@npm:1.3.1": - version: 1.3.1 - resolution: "@vitest/runner@npm:1.3.1" +"@vitest/runner@npm:1.1.3": + version: 1.1.3 + resolution: "@vitest/runner@npm:1.1.3" dependencies: - "@vitest/utils": "npm:1.3.1" + "@vitest/utils": "npm:1.1.3" p-limit: "npm:^5.0.0" pathe: "npm:^1.1.1" - checksum: 10c0/d732de2368d2bc32cbc27f0bbc5477f6e36088ddfb873c036935a45b1b252ebc529b932cf5cd944eed9b692243acebef828f6d3218583cb8a6817a8270712050 + checksum: 10c0/544455f7d7d3e04e8b6df18dfc8dec0ca5a90dd6c39ce72685de4383d4b2f77e907e6cf225df12af5127293344256056021d3d39b8c8960e943a518c30196801 languageName: node linkType: hard -"@vitest/snapshot@npm:1.3.1": - version: 1.3.1 - resolution: "@vitest/snapshot@npm:1.3.1" +"@vitest/snapshot@npm:1.1.3": + version: 1.1.3 + resolution: "@vitest/snapshot@npm:1.1.3" dependencies: magic-string: "npm:^0.30.5" pathe: "npm:^1.1.1" pretty-format: "npm:^29.7.0" - checksum: 10c0/cad0844270852c6d53c1ca6b7ca279034880d2140837ff245d5bd2376f4356cc924929c58dc69bcf9fad83ba934d4a06000c908971cc24b5d7a9ec2656b72d29 + checksum: 10c0/bf841693c0210a12b96060e5bc5d3eeda36d6d96f3446c789ccaf22c68d13c41d868d0e76dddcd298cd7c08564f0bed75ad26fb2e94e4909d83f60b5ec9c8904 languageName: node linkType: hard -"@vitest/spy@npm:1.3.1": - version: 1.3.1 - resolution: "@vitest/spy@npm:1.3.1" +"@vitest/spy@npm:1.1.3": + version: 1.1.3 + resolution: "@vitest/spy@npm:1.1.3" dependencies: tinyspy: "npm:^2.2.0" - checksum: 10c0/efc42f679d2a51fc6583ca3136ccd47581cb27c923ed3cb0500f5dee9aac99b681bfdd400c16ef108f2e0761daa642bc190816a6411931a2aba99ebf8b213dd4 + checksum: 10c0/d1692582afb7b665ec283723b15bbb7da95896cbfd7befaad9fdac6b64a8250fd918781263d43e8e10ee4874cdd18646224f6d993749c3751296dced8095a9ed languageName: node linkType: hard -"@vitest/utils@npm:1.3.1": - version: 1.3.1 - resolution: "@vitest/utils@npm:1.3.1" +"@vitest/utils@npm:1.1.3": + version: 1.1.3 + resolution: "@vitest/utils@npm:1.1.3" dependencies: diff-sequences: "npm:^29.6.3" estree-walker: "npm:^3.0.3" loupe: "npm:^2.3.7" pretty-format: "npm:^29.7.0" - checksum: 10c0/d604c8ad3b1aee30d4dcd889098f591407bfe18547ff96485b1d1ed54eff58219c756a9544a7fbd4e37886863abacd7a89a76334cb3ea7f84c3d496bb757db23 + checksum: 10c0/86f48a7722927741449f40f33584dd9857629782f6661654225b5dd3c039d61cc60806c5dfe419bd793f2a231ba91fe708cbdec5d99b62a1f6f819b6f2121fc3 languageName: node linkType: hard @@ -1504,14 +1558,14 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.3.2": +"acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.3.1": version: 8.3.2 resolution: "acorn-walk@npm:8.3.2" checksum: 10c0/7e2a8dad5480df7f872569b9dccff2f3da7e65f5353686b1d6032ab9f4ddf6e3a2cb83a9b52cf50b1497fd522154dda92f0abf7153290cc79cd14721ff121e52 languageName: node linkType: hard -"acorn@npm:^8.11.3, acorn@npm:^8.4.1": +"acorn@npm:^8.10.0, acorn@npm:^8.11.3, acorn@npm:^8.4.1": version: 8.11.3 resolution: "acorn@npm:8.11.3" bin: @@ -1638,7 +1692,7 @@ __metadata: languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.0": +"array-buffer-byte-length@npm:^1.0.0, array-buffer-byte-length@npm:^1.0.1": version: 1.0.1 resolution: "array-buffer-byte-length@npm:1.0.1" dependencies: @@ -1648,6 +1702,34 @@ __metadata: languageName: node linkType: hard +"array.prototype.every@npm:^1.1.5": + version: 1.1.5 + resolution: "array.prototype.every@npm:1.1.5" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + is-string: "npm:^1.0.7" + checksum: 10c0/390174d30706cc13629de9cb75a1d5776b1ce87038c3bfdf30fcefe82c0736e4dac7a11019518fa48c1ed6b96755220f5d5b358aa08126c1aa6a3dc1b2a6fecb + languageName: node + linkType: hard + +"arraybuffer.prototype.slice@npm:^1.0.3": + version: 1.0.3 + resolution: "arraybuffer.prototype.slice@npm:1.0.3" + dependencies: + array-buffer-byte-length: "npm:^1.0.1" + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.22.3" + es-errors: "npm:^1.2.1" + get-intrinsic: "npm:^1.2.3" + is-array-buffer: "npm:^3.0.4" + is-shared-array-buffer: "npm:^1.0.2" + checksum: 10c0/d32754045bcb2294ade881d45140a5e52bda2321b9e98fa514797b7f0d252c4c5ab0d1edb34112652c62fa6a9398def568da63a4d7544672229afea283358c36 + languageName: node + linkType: hard + "assertion-error@npm:^1.1.0": version: 1.1.0 resolution: "assertion-error@npm:1.1.0" @@ -1655,7 +1737,7 @@ __metadata: languageName: node linkType: hard -"available-typed-arrays@npm:^1.0.6": +"available-typed-arrays@npm:^1.0.6, available-typed-arrays@npm:^1.0.7": version: 1.0.7 resolution: "available-typed-arrays@npm:1.0.7" dependencies: @@ -1825,13 +1907,13 @@ __metadata: version: 0.0.0-use.local resolution: "bun@workspace:benchmarks/bun" dependencies: - "@blueprintjs/icons": "npm:4.6.3" - "@floating-ui/react-dom-interactions": "npm:0.10.1" - "@happy-dom/global-registrator": "npm:12.10.3" - clsx: "npm:1.2.1" + "@blueprintjs/icons": "npm:4.16.0" + "@floating-ui/react-dom-interactions": "npm:0.10.3" + "@happy-dom/global-registrator": "npm:13.6.2" + clsx: "npm:2.1.0" date-fns: "npm:2.29.3" framer-motion: "npm:7.5.3" - happy-dom: "npm:12.0.1" + happy-dom: "npm:13.6.2" react: "npm:18.2.0" react-dom: "npm:18.2.0" languageName: unknown @@ -1864,7 +1946,7 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6": +"call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": version: 1.0.7 resolution: "call-bind@npm:1.0.7" dependencies: @@ -2019,7 +2101,7 @@ __metadata: languageName: node linkType: hard -"classnames@npm:^2.3.2": +"classnames@npm:^2.3.1": version: 2.5.1 resolution: "classnames@npm:2.5.1" checksum: 10c0/afff4f77e62cea2d79c39962980bf316bacb0d7c49e13a21adaadb9221e1c6b9d3cdb829d8bb1b23c406f4e740507f37e1dcf506f7e3b7113d17c5bab787aa69 @@ -2044,10 +2126,10 @@ __metadata: languageName: node linkType: hard -"clsx@npm:1.2.1": - version: 1.2.1 - resolution: "clsx@npm:1.2.1" - checksum: 10c0/34dead8bee24f5e96f6e7937d711978380647e936a22e76380290e35486afd8634966ce300fc4b74a32f3762c7d4c0303f442c3e259f4ce02374eb0c82834f27 +"clsx@npm:2.1.0": + version: 2.1.0 + resolution: "clsx@npm:2.1.0" + checksum: 10c0/c09c00ad14f638366ca814097e6cab533dfa1972a358da5b557be487168acbb25b4c1395e89ffa842a8a61ba87a462d2b4885bc9d4f8410b598f3cb339599cdb languageName: node linkType: hard @@ -2187,13 +2269,6 @@ __metadata: languageName: node linkType: hard -"css.escape@npm:^1.5.1": - version: 1.5.1 - resolution: "css.escape@npm:1.5.1" - checksum: 10c0/5e09035e5bf6c2c422b40c6df2eb1529657a17df37fda5d0433d722609527ab98090baf25b13970ca754079a0f3161dd3dfc0e743563ded8cfa0749d861c1525 - languageName: node - linkType: hard - "cssesc@npm:^3.0.0": version: 3.0.0 resolution: "cssesc@npm:3.0.0" @@ -2259,7 +2334,7 @@ __metadata: languageName: node linkType: hard -"deep-equal@npm:^2.0.5": +"deep-equal@npm:^2.0.5, deep-equal@npm:^2.2.3": version: 2.2.3 resolution: "deep-equal@npm:2.2.3" dependencies: @@ -2292,7 +2367,7 @@ __metadata: languageName: node linkType: hard -"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.2, define-data-property@npm:^1.1.4": +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.1, define-data-property@npm:^1.1.2, define-data-property@npm:^1.1.4": version: 1.1.4 resolution: "define-data-property@npm:1.1.4" dependencies: @@ -2303,7 +2378,7 @@ __metadata: languageName: node linkType: hard -"define-properties@npm:^1.1.3, define-properties@npm:^1.2.1": +"define-properties@npm:^1.1.3, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" dependencies: @@ -2314,6 +2389,13 @@ __metadata: languageName: node linkType: hard +"defined@npm:^1.0.1": + version: 1.0.1 + resolution: "defined@npm:1.0.1" + checksum: 10c0/357212c95fd69c3b431f4766440f1b10a8362d2663b86e3d7c139fe7fc98a1d5a4996b8b55ca62e97fb882f9887374b76944d29f9650a07993d98e7be86a804a + languageName: node + linkType: hard + "detect-newline@npm:^3.0.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" @@ -2335,6 +2417,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:^5.1.0": + version: 5.2.0 + resolution: "diff@npm:5.2.0" + checksum: 10c0/aed0941f206fe261ecb258dc8d0ceea8abbde3ace5827518ff8d302f0fc9cc81ce116c4d8f379151171336caf0516b79e01abdc1ed1201b6440d895a66689eb4 + languageName: node + linkType: hard + "dom-accessibility-api@npm:^0.5.9": version: 0.5.16 resolution: "dom-accessibility-api@npm:0.5.16" @@ -2352,6 +2441,17 @@ __metadata: languageName: node linkType: hard +"dotignore@npm:^0.1.2": + version: 0.1.2 + resolution: "dotignore@npm:0.1.2" + dependencies: + minimatch: "npm:^3.0.4" + bin: + ignored: bin/ignored + checksum: 10c0/71f25a507cbe88a7dbf07d5108bb0924af39c71a3c5fd83045fc42d5dc1605a23113ba29999b94d964555e6e6be2980caa8da3711cfa31a6b6d88c184b1ab181 + languageName: node + linkType: hard + "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" @@ -2433,6 +2533,55 @@ __metadata: languageName: node linkType: hard +"es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3": + version: 1.22.5 + resolution: "es-abstract@npm:1.22.5" + dependencies: + array-buffer-byte-length: "npm:^1.0.1" + arraybuffer.prototype.slice: "npm:^1.0.3" + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.7" + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + es-set-tostringtag: "npm:^2.0.3" + es-to-primitive: "npm:^1.2.1" + function.prototype.name: "npm:^1.1.6" + get-intrinsic: "npm:^1.2.4" + get-symbol-description: "npm:^1.0.2" + globalthis: "npm:^1.0.3" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.0.3" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.1" + internal-slot: "npm:^1.0.7" + is-array-buffer: "npm:^3.0.4" + is-callable: "npm:^1.2.7" + is-negative-zero: "npm:^2.0.3" + is-regex: "npm:^1.1.4" + is-shared-array-buffer: "npm:^1.0.3" + is-string: "npm:^1.0.7" + is-typed-array: "npm:^1.1.13" + is-weakref: "npm:^1.0.2" + object-inspect: "npm:^1.13.1" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.5" + regexp.prototype.flags: "npm:^1.5.2" + safe-array-concat: "npm:^1.1.0" + safe-regex-test: "npm:^1.0.3" + string.prototype.trim: "npm:^1.2.8" + string.prototype.trimend: "npm:^1.0.7" + string.prototype.trimstart: "npm:^1.0.7" + typed-array-buffer: "npm:^1.0.2" + typed-array-byte-length: "npm:^1.0.1" + typed-array-byte-offset: "npm:^1.0.2" + typed-array-length: "npm:^1.0.5" + unbox-primitive: "npm:^1.0.2" + which-typed-array: "npm:^1.1.14" + checksum: 10c0/4bca5a60f0dff6c0a5690d8e51374cfcb8760d5dbbb1069174b4d41461cf4e0c3e0c1993bccbc5aa0799ff078199f1bcde2122b8709e0d17c2beffafff01010a + languageName: node + linkType: hard + "es-define-property@npm:^1.0.0": version: 1.0.0 resolution: "es-define-property@npm:1.0.0" @@ -2442,7 +2591,7 @@ __metadata: languageName: node linkType: hard -"es-errors@npm:^1.3.0": +"es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": version: 1.3.0 resolution: "es-errors@npm:1.3.0" checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 @@ -2466,6 +2615,28 @@ __metadata: languageName: node linkType: hard +"es-set-tostringtag@npm:^2.0.3": + version: 2.0.3 + resolution: "es-set-tostringtag@npm:2.0.3" + dependencies: + get-intrinsic: "npm:^1.2.4" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.1" + checksum: 10c0/f22aff1585eb33569c326323f0b0d175844a1f11618b86e193b386f8be0ea9474cfbe46df39c45d959f7aa8f6c06985dc51dd6bce5401645ec5a74c4ceaa836a + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.2.1": + version: 1.2.1 + resolution: "es-to-primitive@npm:1.2.1" + dependencies: + is-callable: "npm:^1.1.4" + is-date-object: "npm:^1.0.1" + is-symbol: "npm:^1.0.2" + checksum: 10c0/0886572b8dc075cb10e50c0af62a03d03a68e1e69c388bd4f10c0649ee41b1fbb24840a1b7e590b393011b5cdbe0144b776da316762653685432df37d6de60f1 + languageName: node + linkType: hard + "esbuild@npm:^0.19.3": version: 0.19.12 resolution: "esbuild@npm:0.19.12" @@ -2789,6 +2960,18 @@ __metadata: languageName: node linkType: hard +"function.prototype.name@npm:^1.1.6": + version: 1.1.6 + resolution: "function.prototype.name@npm:1.1.6" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + functions-have-names: "npm:^1.2.3" + checksum: 10c0/9eae11294905b62cb16874adb4fc687927cda3162285e0ad9612e6a1d04934005d46907362ea9cdb7428edce05a2f2c3dabc3b2d21e9fd343e9bb278230ad94b + languageName: node + linkType: hard + "functions-have-names@npm:^1.2.3": version: 1.2.3 resolution: "functions-have-names@npm:1.2.3" @@ -2860,6 +3043,17 @@ __metadata: languageName: node linkType: hard +"get-symbol-description@npm:^1.0.2": + version: 1.0.2 + resolution: "get-symbol-description@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.5" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.4" + checksum: 10c0/867be6d63f5e0eb026cb3b0ef695ec9ecf9310febb041072d2e142f260bd91ced9eeb426b3af98791d1064e324e653424afa6fd1af17dee373bea48ae03162bc + languageName: node + linkType: hard + "glob-to-regexp@npm:^0.3.0": version: 0.3.0 resolution: "glob-to-regexp@npm:0.3.0" @@ -2882,7 +3076,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.1.3, glob@npm:^7.1.4": +"glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.2.3": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -2903,6 +3097,15 @@ __metadata: languageName: node linkType: hard +"globalthis@npm:^1.0.3": + version: 1.0.3 + resolution: "globalthis@npm:1.0.3" + dependencies: + define-properties: "npm:^1.1.3" + checksum: 10c0/0db6e9af102a5254630351557ac15e6909bc7459d3e3f6b001e59fe784c96d31108818f032d9095739355a88467459e6488ff16584ee6250cd8c27dec05af4b0 + languageName: node + linkType: hard + "gopd@npm:^1.0.1": version: 1.0.1 resolution: "gopd@npm:1.0.1" @@ -2919,31 +3122,14 @@ __metadata: languageName: node linkType: hard -"happy-dom@npm:12.0.1": - version: 12.0.1 - resolution: "happy-dom@npm:12.0.1" +"happy-dom@npm:13.6.2, happy-dom@npm:^13.6.2": + version: 13.6.2 + resolution: "happy-dom@npm:13.6.2" dependencies: - css.escape: "npm:^1.5.1" entities: "npm:^4.5.0" - iconv-lite: "npm:^0.6.3" webidl-conversions: "npm:^7.0.0" - whatwg-encoding: "npm:^2.0.0" whatwg-mimetype: "npm:^3.0.0" - checksum: 10c0/fa8da240a22f672fb2673acdf6ffdeb6f87667ee6b4d9e4a91908e3203a90fbb2f0da2f043ad78b53de1ff73fc4f64db7b5f7f2f76e27f277f2a9c481512e9d5 - languageName: node - linkType: hard - -"happy-dom@npm:12.10.3": - version: 12.10.3 - resolution: "happy-dom@npm:12.10.3" - dependencies: - css.escape: "npm:^1.5.1" - entities: "npm:^4.5.0" - iconv-lite: "npm:^0.6.3" - webidl-conversions: "npm:^7.0.0" - whatwg-encoding: "npm:^2.0.0" - whatwg-mimetype: "npm:^3.0.0" - checksum: 10c0/fbf8647e17c4af5c166d7c4b6963f4bbc9d1c279e94a4c77234b1fecca98c59989b894c7b186f5107e1062d40ffd84f12350b757f51330a5fc1c5228eb199517 + checksum: 10c0/0e76ab3948c454809ea3f9ca02e492881ab0c52a0e5c9e774c6a8885ba7ff03905777a043306e949fc4bb57159ee15d51231be587c7600096e1a9d396877d61c languageName: node linkType: hard @@ -2954,13 +3140,23 @@ __metadata: languageName: node linkType: hard -"has-bigints@npm:^1.0.1": +"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": version: 1.0.2 resolution: "has-bigints@npm:1.0.2" checksum: 10c0/724eb1485bfa3cdff6f18d95130aa190561f00b3fcf9f19dc640baf8176b5917c143b81ec2123f8cddb6c05164a198c94b13e1377c497705ccc8e1a80306e83b languageName: node linkType: hard +"has-dynamic-import@npm:^2.1.0": + version: 2.1.0 + resolution: "has-dynamic-import@npm:2.1.0" + dependencies: + call-bind: "npm:^1.0.5" + get-intrinsic: "npm:^1.2.2" + checksum: 10c0/28faf3ae3538a198202c9e5b6c9a1071f0a16df2ff748440525fd30f6485e8532a4d205e2c21f4013d6663730f9d3b44dcae1519d20f946a223b3763118db653 + languageName: node + linkType: hard + "has-flag@npm:^3.0.0": version: 3.0.0 resolution: "has-flag@npm:3.0.0" @@ -2984,7 +3180,7 @@ __metadata: languageName: node linkType: hard -"has-proto@npm:^1.0.1": +"has-proto@npm:^1.0.1, has-proto@npm:^1.0.3": version: 1.0.3 resolution: "has-proto@npm:1.0.3" checksum: 10c0/35a6989f81e9f8022c2f4027f8b48a552de714938765d019dbea6bb547bd49ce5010a3c7c32ec6ddac6e48fc546166a3583b128f5a7add8b058a6d8b4afec205 @@ -2998,7 +3194,7 @@ __metadata: languageName: node linkType: hard -"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.1": +"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.1, has-tostringtag@npm:^1.0.2": version: 1.0.2 resolution: "has-tostringtag@npm:1.0.2" dependencies: @@ -3007,7 +3203,7 @@ __metadata: languageName: node linkType: hard -"hasown@npm:^2.0.0": +"hasown@npm:^2.0.0, hasown@npm:^2.0.1": version: 2.0.1 resolution: "hasown@npm:2.0.1" dependencies: @@ -3081,7 +3277,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2, iconv-lite@npm:^0.6.3": +"iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -3151,14 +3347,14 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2": +"inherits@npm:2, inherits@npm:^2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 languageName: node linkType: hard -"internal-slot@npm:^1.0.4": +"internal-slot@npm:^1.0.4, internal-slot@npm:^1.0.7": version: 1.0.7 resolution: "internal-slot@npm:1.0.7" dependencies: @@ -3225,7 +3421,7 @@ __metadata: languageName: node linkType: hard -"is-callable@npm:^1.1.3": +"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f @@ -3241,7 +3437,7 @@ __metadata: languageName: node linkType: hard -"is-date-object@npm:^1.0.5": +"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": version: 1.0.5 resolution: "is-date-object@npm:1.0.5" dependencies: @@ -3278,6 +3474,13 @@ __metadata: languageName: node linkType: hard +"is-negative-zero@npm:^2.0.3": + version: 2.0.3 + resolution: "is-negative-zero@npm:2.0.3" + checksum: 10c0/bcdcf6b8b9714063ffcfa9929c575ac69bfdabb8f4574ff557dfc086df2836cf07e3906f5bbc4f2a5c12f8f3ba56af640c843cdfc74da8caed86c7c7d66fd08e + languageName: node + linkType: hard + "is-number-object@npm:^1.0.4": version: 1.0.7 resolution: "is-number-object@npm:1.0.7" @@ -3320,6 +3523,15 @@ __metadata: languageName: node linkType: hard +"is-shared-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "is-shared-array-buffer@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.7" + checksum: 10c0/adc11ab0acbc934a7b9e5e9d6c588d4ec6682f6fea8cda5180721704fa32927582ede5b123349e32517fdadd07958973d24716c80e7ab198970c47acc09e59c7 + languageName: node + linkType: hard + "is-stream@npm:^2.0.0": version: 2.0.1 resolution: "is-stream@npm:2.0.1" @@ -3343,7 +3555,7 @@ __metadata: languageName: node linkType: hard -"is-symbol@npm:^1.0.3": +"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": version: 1.0.4 resolution: "is-symbol@npm:1.0.4" dependencies: @@ -3352,6 +3564,15 @@ __metadata: languageName: node linkType: hard +"is-typed-array@npm:^1.1.13": + version: 1.1.13 + resolution: "is-typed-array@npm:1.1.13" + dependencies: + which-typed-array: "npm:^1.1.14" + checksum: 10c0/fa5cb97d4a80e52c2cc8ed3778e39f175a1a2ae4ddf3adae3187d69586a1fd57cfa0b095db31f66aa90331e9e3da79184cea9c6abdcd1abc722dc3c3edd51cca + languageName: node + linkType: hard + "is-weakmap@npm:^2.0.1": version: 2.0.1 resolution: "is-weakmap@npm:2.0.1" @@ -3359,6 +3580,15 @@ __metadata: languageName: node linkType: hard +"is-weakref@npm:^1.0.2": + version: 1.0.2 + resolution: "is-weakref@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + checksum: 10c0/1545c5d172cb690c392f2136c23eec07d8d78a7f57d0e41f10078aa4f5daf5d7f57b6513a67514ab4f073275ad00c9822fc8935e00229d0a2089e1c02685d4b1 + languageName: node + linkType: hard + "is-weakset@npm:^2.0.1": version: 2.0.2 resolution: "is-weakset@npm:2.0.2" @@ -3491,14 +3721,14 @@ __metadata: version: 0.0.0-use.local resolution: "jasmine@workspace:benchmarks/jasmine" dependencies: - "@blueprintjs/icons": "npm:4.6.3" - "@floating-ui/react-dom-interactions": "npm:0.10.1" - "@types/jasmine": "npm:4.3.0" - clsx: "npm:1.2.1" + "@blueprintjs/icons": "npm:4.16.0" + "@floating-ui/react-dom-interactions": "npm:0.10.3" + "@types/jasmine": "npm:5.1.4" + clsx: "npm:2.1.0" css-modules-require-hook: "npm:4.2.3" date-fns: "npm:2.29.3" framer-motion: "npm:7.5.3" - happy-dom: "npm:12.0.1" + happy-dom: "npm:13.6.2" jasmine: "npm:5.1.0" react: "npm:18.2.0" react-dom: "npm:18.2.0" @@ -3949,12 +4179,12 @@ __metadata: version: 0.0.0-use.local resolution: "jest@workspace:benchmarks/jest" dependencies: - "@blueprintjs/icons": "npm:4.6.3" - "@floating-ui/react-dom-interactions": "npm:0.10.1" - "@happy-dom/jest-environment": "npm:12.0.1" - "@testing-library/react": "npm:13.4.0" - "@testing-library/user-event": "npm:14.4.3" - clsx: "npm:1.2.1" + "@blueprintjs/icons": "npm:4.16.0" + "@floating-ui/react-dom-interactions": "npm:0.10.3" + "@happy-dom/jest-environment": "npm:13.6.2" + "@testing-library/react": "npm:14.2.1" + "@testing-library/user-event": "npm:14.5.2" + clsx: "npm:2.1.0" date-fns: "npm:2.29.3" framer-motion: "npm:7.5.3" identity-obj-proxy: "npm:3.0.0" @@ -3962,7 +4192,7 @@ __metadata: react: "npm:18.2.0" react-dom: "npm:18.2.0" ts-jest: "npm:29.1.2" - typescript: "npm:4.8.4" + typescript: "npm:5.3.3" languageName: unknown linkType: soft @@ -3973,13 +4203,6 @@ __metadata: languageName: node linkType: hard -"js-tokens@npm:^8.0.2": - version: 8.0.3 - resolution: "js-tokens@npm:8.0.3" - checksum: 10c0/b50ba7d926b087ad31949d8155c7bc84374e0785019b17bdddeb2c4f98f5dea04ba464651fe23a8be4f7d15f50d06ce8bb536087b24ce3ebfbaea4a1dc5869f0 - languageName: node - linkType: hard - "js-yaml@npm:^3.13.1": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" @@ -4040,6 +4263,13 @@ __metadata: languageName: node linkType: hard +"just-extend@npm:^6.2.0": + version: 6.2.0 + resolution: "just-extend@npm:6.2.0" + checksum: 10c0/d41cbdb6d85b986d4deaf2144d81d4f7266cd408fc95189d046d63f610c2dc486b141aeb6ef319c2d76fe904d45a6bb31f19b098ff0427c35688e0c383fc0511 + languageName: node + linkType: hard + "kleur@npm:^3.0.3": version: 3.0.3 resolution: "kleur@npm:3.0.3" @@ -4092,6 +4322,13 @@ __metadata: languageName: node linkType: hard +"lodash.get@npm:^4.4.2": + version: 4.4.2 + resolution: "lodash.get@npm:4.4.2" + checksum: 10c0/48f40d471a1654397ed41685495acb31498d5ed696185ac8973daef424a749ca0c7871bf7b665d5c14f5cc479394479e0307e781f61d5573831769593411be6e + languageName: node + linkType: hard + "lodash.memoize@npm:4.x": version: 4.1.2 resolution: "lodash.memoize@npm:4.1.2" @@ -4271,7 +4508,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0": +"minimist@npm:^1.2.0, minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 @@ -4383,6 +4620,20 @@ __metadata: languageName: node linkType: hard +"mock-property@npm:^1.0.3": + version: 1.0.3 + resolution: "mock-property@npm:1.0.3" + dependencies: + define-data-property: "npm:^1.1.1" + functions-have-names: "npm:^1.2.3" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + hasown: "npm:^2.0.0" + isarray: "npm:^2.0.5" + checksum: 10c0/faab39ef1f90fe52367f5173bf8aa2d795fb13998eea2f028f94d4d822809fdfe880627f79c39b759a265697fa88b659bef0fd9593926db6c265f3d9566bd89b + languageName: node + linkType: hard + "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -4420,6 +4671,19 @@ __metadata: languageName: node linkType: hard +"nise@npm:^5.1.5": + version: 5.1.9 + resolution: "nise@npm:5.1.9" + dependencies: + "@sinonjs/commons": "npm:^3.0.0" + "@sinonjs/fake-timers": "npm:^11.2.2" + "@sinonjs/text-encoding": "npm:^0.7.2" + just-extend: "npm:^6.2.0" + path-to-regexp: "npm:^6.2.1" + checksum: 10c0/a44318e6de738b34a1f51b4b478f97f5b40a5a27175be4bf13f6e5b8e67aa70d0b3f51c77a966d6617fccdc3b436c675a89be57424833e6d8a290367faa66b28 + languageName: node + linkType: hard + "no-case@npm:^3.0.4": version: 3.0.4 resolution: "no-case@npm:3.0.4" @@ -4531,7 +4795,7 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.4": +"object.assign@npm:^4.1.4, object.assign@npm:^4.1.5": version: 4.1.5 resolution: "object.assign@npm:4.1.5" dependencies: @@ -4709,6 +4973,13 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:^6.2.1": + version: 6.2.1 + resolution: "path-to-regexp@npm:6.2.1" + checksum: 10c0/7a73811ca703e5c199e5b50b9649ab8f6f7b458a37f7dff9ea338815203f5b1f95fe8cb24d4fdfe2eab5d67ce43562d92534330babca35cdf3231f966adb9360 + languageName: node + linkType: hard + "pathe@npm:^1.1.0, pathe@npm:^1.1.1, pathe@npm:^1.1.2": version: 1.1.2 resolution: "pathe@npm:1.1.2" @@ -4955,7 +5226,7 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.1": +"regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.2": version: 1.5.2 resolution: "regexp.prototype.flags@npm:1.5.2" dependencies: @@ -5010,6 +5281,19 @@ __metadata: languageName: node linkType: hard +"resolve@npm:^2.0.0-next.5": + version: 2.0.0-next.5 + resolution: "resolve@npm:2.0.0-next.5" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/a6c33555e3482ea2ec4c6e3d3bf0d78128abf69dca99ae468e64f1e30acaa318fd267fb66c8836b04d558d3e2d6ed875fe388067e7d8e0de647d3c21af21c43a + languageName: node + linkType: hard + "resolve@patch:resolve@npm%3A^1.20.0#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" @@ -5023,6 +5307,19 @@ __metadata: languageName: node linkType: hard +"resolve@patch:resolve@npm%3A^2.0.0-next.5#optional!builtin": + version: 2.0.0-next.5 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#optional!builtin::version=2.0.0-next.5&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/78ad6edb8309a2bfb720c2c1898f7907a37f858866ce11a5974643af1203a6a6e05b2fa9c53d8064a673a447b83d42569260c306d43628bff5bb101969708355 + languageName: node + linkType: hard + "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -5084,6 +5381,29 @@ __metadata: languageName: node linkType: hard +"safe-array-concat@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-array-concat@npm:1.1.0" + dependencies: + call-bind: "npm:^1.0.5" + get-intrinsic: "npm:^1.2.2" + has-symbols: "npm:^1.0.3" + isarray: "npm:^2.0.5" + checksum: 10c0/833d3d950fc7507a60075f9bfaf41ec6dac7c50c7a9d62b1e6b071ecc162185881f92e594ff95c1a18301c881352dd6fd236d56999d5819559db7b92da9c28af + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.0.3": + version: 1.0.3 + resolution: "safe-regex-test@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.6" + es-errors: "npm:^1.3.0" + is-regex: "npm:^1.1.4" + checksum: 10c0/900bf7c98dc58f08d8523b7012b468e4eb757afa624f198902c0643d7008ba777b0bdc35810ba0b758671ce887617295fb742b3f3968991b178ceca54cb07603 + languageName: node + linkType: hard + "safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -5213,6 +5533,20 @@ __metadata: languageName: node linkType: hard +"sinon@npm:17.0.1": + version: 17.0.1 + resolution: "sinon@npm:17.0.1" + dependencies: + "@sinonjs/commons": "npm:^3.0.0" + "@sinonjs/fake-timers": "npm:^11.2.2" + "@sinonjs/samsam": "npm:^8.0.0" + diff: "npm:^5.1.0" + nise: "npm:^5.1.5" + supports-color: "npm:^7.2.0" + checksum: 10c0/63e678bd58a959ebf69ddadb5410e9c31bd161b848b9dbec5f34f7e1485a8681810cd27d37bde072b68915b41b498f30bb5fb890c73e7a51dc281d1b1d573cfb + languageName: node + linkType: hard + "sisteransi@npm:^1.0.5": version: 1.0.5 resolution: "sisteransi@npm:1.0.5" @@ -5376,6 +5710,39 @@ __metadata: languageName: node linkType: hard +"string.prototype.trim@npm:^1.2.8": + version: 1.2.8 + resolution: "string.prototype.trim@npm:1.2.8" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 10c0/4f76c583908bcde9a71208ddff38f67f24c9ec8093631601666a0df8b52fad44dad2368c78895ce83eb2ae8e7068294cc96a02fc971ab234e4d5c9bb61ea4e34 + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.7": + version: 1.0.7 + resolution: "string.prototype.trimend@npm:1.0.7" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 10c0/53c24911c7c4d8d65f5ef5322de23a3d5b6b4db73273e05871d5ab4571ae5638f38f7f19d71d09116578fb060e5a145cc6a208af2d248c8baf7a34f44d32ce57 + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.7": + version: 1.0.7 + resolution: "string.prototype.trimstart@npm:1.0.7" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 10c0/0bcf391b41ea16d4fda9c9953d0a7075171fe090d33b4cf64849af94944c50862995672ac03e0c5dba2940a213ad7f53515a668dac859ce22a0276289ae5cf4f + languageName: node + linkType: hard + "strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" @@ -5422,12 +5789,12 @@ __metadata: languageName: node linkType: hard -"strip-literal@npm:^2.0.0": - version: 2.0.0 - resolution: "strip-literal@npm:2.0.0" +"strip-literal@npm:^1.3.0": + version: 1.3.0 + resolution: "strip-literal@npm:1.3.0" dependencies: - js-tokens: "npm:^8.0.2" - checksum: 10c0/63a6e4224ac7088ff93fd19fc0f6882705020da2f0767dbbecb929cbf9d49022e72350420f47be635866823608da9b9a5caf34f518004721895b6031199fc3c8 + acorn: "npm:^8.10.0" + checksum: 10c0/3c0c9ee41eb346e827eede61ef288457f53df30e3e6ff8b94fa81b636933b0c13ca4ea5c97d00a10d72d04be326da99ac819f8769f0c6407ba8177c98344a916 languageName: node linkType: hard @@ -5450,7 +5817,7 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^7.1.0": +"supports-color@npm:^7.1.0, supports-color@npm:^7.2.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" dependencies: @@ -5475,6 +5842,77 @@ __metadata: languageName: node linkType: hard +"tape-decorate@npm:^1.0.2": + version: 1.0.2 + resolution: "tape-decorate@npm:1.0.2" + checksum: 10c0/ce72b3a2d249f4b9d77d8ca910c8aafc95e77a02d76e85c5349554af0a7e2c898151016e9d418ac28cd48fcd544e50360f0e15c20b5dde8b6fa8f0d4f71f639c + languageName: node + linkType: hard + +"tape-describe@npm:1.0.3": + version: 1.0.3 + resolution: "tape-describe@npm:1.0.3" + dependencies: + tape-decorate: "npm:^1.0.2" + checksum: 10c0/3bd38626ce10002e24ea788fb03f93e1c81a91727400c24c2622c9c873130a64947201c70929c695ac7f4fcbfb78cd3d2d722b11096352d7a8d344dfa2b4135a + languageName: node + linkType: hard + +"tape@npm:5.7.5": + version: 5.7.5 + resolution: "tape@npm:5.7.5" + dependencies: + "@ljharb/resumer": "npm:^0.1.2" + "@ljharb/through": "npm:^2.3.12" + array.prototype.every: "npm:^1.1.5" + call-bind: "npm:^1.0.7" + deep-equal: "npm:^2.2.3" + defined: "npm:^1.0.1" + dotignore: "npm:^0.1.2" + for-each: "npm:^0.3.3" + get-package-type: "npm:^0.1.0" + glob: "npm:^7.2.3" + has-dynamic-import: "npm:^2.1.0" + hasown: "npm:^2.0.1" + inherits: "npm:^2.0.4" + is-regex: "npm:^1.1.4" + minimist: "npm:^1.2.8" + mock-property: "npm:^1.0.3" + object-inspect: "npm:^1.13.1" + object-is: "npm:^1.1.5" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.5" + resolve: "npm:^2.0.0-next.5" + string.prototype.trim: "npm:^1.2.8" + bin: + tape: bin/tape + checksum: 10c0/59a883ba3b8ceb62f78cf3f254d510f6434b7a7020007713e557c9be74c44242cb37e5921389022f3d3edb97482e5de1b6bcaf60f5959cc1eec878e45c841b49 + languageName: node + linkType: hard + +"tape@workspace:benchmarks/tape": + version: 0.0.0-use.local + resolution: "tape@workspace:benchmarks/tape" + dependencies: + "@blueprintjs/icons": "npm:4.16.0" + "@floating-ui/react-dom-interactions": "npm:0.10.3" + "@testing-library/react": "npm:14.2.1" + "@testing-library/user-event": "npm:14.5.2" + clsx: "npm:2.1.0" + css-modules-require-hook: "npm:4.2.3" + date-fns: "npm:2.29.3" + framer-motion: "npm:7.5.3" + happy-dom: "npm:13.6.2" + react: "npm:18.2.0" + react-dom: "npm:18.2.0" + sinon: "npm:17.0.1" + tape: "npm:5.7.5" + tape-describe: "npm:1.0.3" + ts-node: "npm:10.9.2" + typescript: "npm:5.3.3" + languageName: unknown + linkType: soft + "tar@npm:^6.1.11, tar@npm:^6.1.2": version: 6.2.0 resolution: "tar@npm:6.2.0" @@ -5513,7 +5951,7 @@ __metadata: languageName: node linkType: hard -"tinypool@npm:^0.8.2": +"tinypool@npm:^0.8.1": version: 0.8.2 resolution: "tinypool@npm:0.8.2" checksum: 10c0/8998626614172fc37c394e9a14e701dc437727fc6525488a4d4fd42044a4b2b59d6f076d750cbf5c699f79c58dd4e40599ab09e2f1ae0df4b23516b98c9c3055 @@ -5635,10 +6073,10 @@ __metadata: languageName: node linkType: hard -"tslib@npm:~2.3.1": - version: 2.3.1 - resolution: "tslib@npm:2.3.1" - checksum: 10c0/4efd888895bdb3b987086b2b7793ad1013566f882b0eb7a328384e5ecc0d71cafb16bbeab3196200cbf7f01a73ccc25acc2f131d4ea6ee959be7436a8a306482 +"tslib@npm:~2.5.0": + version: 2.5.3 + resolution: "tslib@npm:2.5.3" + checksum: 10c0/4cb1817d34fae5b27d146e6c4a468d4155097d95c1335d0bc9690f11f33e63844806bf4ed6d97c30c72b8d85261b66cbbe16d871d9c594ac05701ec83e62a607 languageName: node linkType: hard @@ -5656,23 +6094,75 @@ __metadata: languageName: node linkType: hard -"typescript@npm:4.8.4": - version: 4.8.4 - resolution: "typescript@npm:4.8.4" +"typed-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "typed-array-buffer@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.7" + es-errors: "npm:^1.3.0" + is-typed-array: "npm:^1.1.13" + checksum: 10c0/9e043eb38e1b4df4ddf9dde1aa64919ae8bb909571c1cc4490ba777d55d23a0c74c7d73afcdd29ec98616d91bb3ae0f705fad4421ea147e1daf9528200b562da + languageName: node + linkType: hard + +"typed-array-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "typed-array-byte-length@npm:1.0.1" + dependencies: + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-proto: "npm:^1.0.3" + is-typed-array: "npm:^1.1.13" + checksum: 10c0/fcebeffb2436c9f355e91bd19e2368273b88c11d1acc0948a2a306792f1ab672bce4cfe524ab9f51a0505c9d7cd1c98eff4235c4f6bfef6a198f6cfc4ff3d4f3 + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.2": + version: 1.0.2 + resolution: "typed-array-byte-offset@npm:1.0.2" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-proto: "npm:^1.0.3" + is-typed-array: "npm:^1.1.13" + checksum: 10c0/d2628bc739732072e39269389a758025f75339de2ed40c4f91357023c5512d237f255b633e3106c461ced41907c1bf9a533c7e8578066b0163690ca8bc61b22f + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.5": + version: 1.0.5 + resolution: "typed-array-length@npm:1.0.5" + dependencies: + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-proto: "npm:^1.0.3" + is-typed-array: "npm:^1.1.13" + possible-typed-array-names: "npm:^1.0.0" + checksum: 10c0/5cc0f79196e70a92f8f40846cfa62b3de6be51e83f73655e137116cf65e3c29a288502b18cc8faf33c943c2470a4569009e1d6da338441649a2db2f135761ad5 + languageName: node + linkType: hard + +"typescript@npm:5.3.3": + version: 5.3.3 + resolution: "typescript@npm:5.3.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/663bf455b21ac024e719bb8c6a07bcaaa027a9943abfb58a694b59789e7d08578badb5556170267ad480e31786b8b4c8ab3c9c0e597d3b8df39af800e43c6ed5 + checksum: 10c0/e33cef99d82573624fc0f854a2980322714986bc35b9cb4d1ce736ed182aeab78e2cb32b385efa493b2a976ef52c53e20d6c6918312353a91850e2b76f1ea44f languageName: node linkType: hard -"typescript@patch:typescript@npm%3A4.8.4#optional!builtin": - version: 4.8.4 - resolution: "typescript@patch:typescript@npm%3A4.8.4#optional!builtin::version=4.8.4&hash=1a91c8" +"typescript@patch:typescript@npm%3A5.3.3#optional!builtin": + version: 5.3.3 + resolution: "typescript@patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/eecab597a5a8c6e7f14804f1447cfce02e214e32c02efcfe5219c94290e3d572490e8a0d8033fd075ac429d35babf85182541a50c50bfb0c21df33c59fb9bf82 + checksum: 10c0/1d0a5f4ce496c42caa9a30e659c467c5686eae15d54b027ee7866744952547f1be1262f2d40de911618c242b510029d51d43ff605dba8fb740ec85ca2d3f9500 languageName: node linkType: hard @@ -5683,6 +6173,18 @@ __metadata: languageName: node linkType: hard +"unbox-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "unbox-primitive@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + has-bigints: "npm:^1.0.2" + has-symbols: "npm:^1.0.3" + which-boxed-primitive: "npm:^1.0.2" + checksum: 10c0/81ca2e81134167cc8f75fa79fbcc8a94379d6c61de67090986a2273850989dd3bae8440c163121b77434b68263e34787a675cbdcb34bb2f764c6b9c843a11b66 + languageName: node + linkType: hard + "undici-types@npm:~5.26.4": version: 5.26.5 resolution: "undici-types@npm:5.26.5" @@ -5758,9 +6260,9 @@ __metadata: languageName: node linkType: hard -"vite-node@npm:1.3.1": - version: 1.3.1 - resolution: "vite-node@npm:1.3.1" +"vite-node@npm:1.1.3": + version: 1.1.3 + resolution: "vite-node@npm:1.1.3" dependencies: cac: "npm:^6.7.14" debug: "npm:^4.3.4" @@ -5769,13 +6271,13 @@ __metadata: vite: "npm:^5.0.0" bin: vite-node: vite-node.mjs - checksum: 10c0/b50665ef224f3527f856ab88a0cfabab36dd6e2dd1e3edca8f8f25d5d33754e1050495472c2c82147d0dcf7c5280971dae2f37a531c10f3941d8d3344e34ce0b + checksum: 10c0/011346c156c4df7cb49fc1de357ff7dc6316011faeb00855aca7ecab24ed19aac4c03c0bc921923d13c37870f2954c3fcbf975c5eeee3a03d675831a60556dfb languageName: node linkType: hard "vite@npm:^5.0.0": - version: 5.1.3 - resolution: "vite@npm:5.1.3" + version: 5.1.4 + resolution: "vite@npm:5.1.4" dependencies: esbuild: "npm:^0.19.3" fsevents: "npm:~2.3.3" @@ -5809,20 +6311,21 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/d3b19607d736de60b660f7daf4c0f86589edcbbc1fcb09f8aa36630f99518cc8a063062bb952899b8ccaed62f1314fac22c1df492dd035de3c65998ab27e2d2a + checksum: 10c0/8f04c8bed33f266bde27f432412456a3b893b51fe1857f0b8cd259100b376c1393a7927db1dd6344a4376baed72ed179ec5b0428aef2ae8508f1f28f95acb908 languageName: node linkType: hard -"vitest@npm:1.3.1": - version: 1.3.1 - resolution: "vitest@npm:1.3.1" - dependencies: - "@vitest/expect": "npm:1.3.1" - "@vitest/runner": "npm:1.3.1" - "@vitest/snapshot": "npm:1.3.1" - "@vitest/spy": "npm:1.3.1" - "@vitest/utils": "npm:1.3.1" - acorn-walk: "npm:^8.3.2" +"vitest@npm:1.1.3": + version: 1.1.3 + resolution: "vitest@npm:1.1.3" + dependencies: + "@vitest/expect": "npm:1.1.3" + "@vitest/runner": "npm:1.1.3" + "@vitest/snapshot": "npm:1.1.3" + "@vitest/spy": "npm:1.1.3" + "@vitest/utils": "npm:1.1.3" + acorn-walk: "npm:^8.3.1" + cac: "npm:^6.7.14" chai: "npm:^4.3.10" debug: "npm:^4.3.4" execa: "npm:^8.0.1" @@ -5831,17 +6334,17 @@ __metadata: pathe: "npm:^1.1.1" picocolors: "npm:^1.0.0" std-env: "npm:^3.5.0" - strip-literal: "npm:^2.0.0" + strip-literal: "npm:^1.3.0" tinybench: "npm:^2.5.1" - tinypool: "npm:^0.8.2" + tinypool: "npm:^0.8.1" vite: "npm:^5.0.0" - vite-node: "npm:1.3.1" + vite-node: "npm:1.1.3" why-is-node-running: "npm:^2.2.2" peerDependencies: "@edge-runtime/vm": "*" "@types/node": ^18.0.0 || >=20.0.0 - "@vitest/browser": 1.3.1 - "@vitest/ui": 1.3.1 + "@vitest/browser": ^1.0.0 + "@vitest/ui": ^1.0.0 happy-dom: "*" jsdom: "*" peerDependenciesMeta: @@ -5859,7 +6362,7 @@ __metadata: optional: true bin: vitest: vitest.mjs - checksum: 10c0/66d312a3dc12e67bba22d31332d939e89cd17d38531893c7b13b8826704564031c1dde795df2799b855660572c19a595301e920710c7775d072ee6332502efc5 + checksum: 10c0/5dc6010b14ab069f6483e343724bd4b6ff72c0ea1cca52b2f5d2ea2b0b7acc9584887b2d428af309c855b731d081dc32ec370032d2d40a20492ced5695950acb languageName: node linkType: hard @@ -5867,17 +6370,17 @@ __metadata: version: 0.0.0-use.local resolution: "vitest@workspace:benchmarks/vitest" dependencies: - "@blueprintjs/icons": "npm:4.6.3" - "@floating-ui/react-dom-interactions": "npm:0.10.1" - "@testing-library/react": "npm:13.4.0" - "@testing-library/user-event": "npm:14.4.3" - clsx: "npm:1.2.1" + "@blueprintjs/icons": "npm:4.16.0" + "@floating-ui/react-dom-interactions": "npm:0.10.3" + "@testing-library/react": "npm:14.2.1" + "@testing-library/user-event": "npm:14.5.2" + clsx: "npm:2.1.0" date-fns: "npm:2.29.3" framer-motion: "npm:7.5.3" - happy-dom: "npm:12.0.1" + happy-dom: "npm:13.6.2" react: "npm:18.2.0" react-dom: "npm:18.2.0" - vitest: "npm:1.3.1" + vitest: "npm:1.1.3" languageName: unknown linkType: soft @@ -5897,15 +6400,6 @@ __metadata: languageName: node linkType: hard -"whatwg-encoding@npm:^2.0.0": - version: 2.0.0 - resolution: "whatwg-encoding@npm:2.0.0" - dependencies: - iconv-lite: "npm:0.6.3" - checksum: 10c0/91b90a49f312dc751496fd23a7e68981e62f33afe938b97281ad766235c4872fc4e66319f925c5e9001502b3040dd25a33b02a9c693b73a4cbbfdc4ad10c3e3e - languageName: node - linkType: hard - "whatwg-mimetype@npm:^3.0.0": version: 3.0.0 resolution: "whatwg-mimetype@npm:3.0.0" @@ -5938,7 +6432,7 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.13": +"which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.14": version: 1.1.14 resolution: "which-typed-array@npm:1.1.14" dependencies: