From 93ec87f09d7bb66fbd94f9499f26acbab6fa1f9d Mon Sep 17 00:00:00 2001 From: Ev Haus Date: Sun, 28 May 2023 16:20:38 -0700 Subject: [PATCH] Added tape to list of benchmarks --- .github/workflows/benchmark.yaml | 8 +- README.md | 26 +- benchmarks/bun/package.json | 10 +- benchmarks/jasmine/package.json | 10 +- benchmarks/jasmine/spec/helpers/happydom.ts | 3 - .../original/StatusBadge/StatusBadge.test.tsx | 2 +- benchmarks/jest/package.json | 14 +- benchmarks/tape/helpers/css.ts | 6 + benchmarks/tape/helpers/happydom.ts | 16 + benchmarks/tape/helpers/wrapper.ts | 11 + benchmarks/tape/package.json | 30 + benchmarks/tape/tests/.gitignore | 1 + .../tests/original/Alert/Alert.module.css | 60 ++ .../tape/tests/original/Alert/Alert.test.tsx | 28 + .../tape/tests/original/Alert/Alert.tsx | 48 + benchmarks/tape/tests/original/Alert/index.ts | 1 + .../tests/original/Avatar/Avatar.module.css | 9 + .../tests/original/Avatar/Avatar.test.tsx | 12 + .../tape/tests/original/Avatar/Avatar.tsx | 60 ++ .../tape/tests/original/Avatar/index.ts | 1 + .../tests/original/Badge/Badge.module.css | 53 ++ .../tape/tests/original/Badge/Badge.test.tsx | 12 + .../tape/tests/original/Badge/Badge.tsx | 23 + benchmarks/tape/tests/original/Badge/index.ts | 1 + .../tests/original/Button/Button.module.css | 170 ++++ .../tape/tests/original/Button/Button.tsx | 102 ++ .../tape/tests/original/Button/index.ts | 1 + .../tape/tests/original/Card/Card.module.css | 7 + .../tape/tests/original/Card/Card.test.tsx | 12 + benchmarks/tape/tests/original/Card/Card.tsx | 19 + benchmarks/tape/tests/original/Card/index.ts | 1 + .../original/Checkbox/Checkbox.module.css | 54 ++ .../tests/original/Checkbox/Checkbox.test.tsx | 19 + .../tape/tests/original/Checkbox/Checkbox.tsx | 67 ++ .../tape/tests/original/Checkbox/index.ts | 1 + .../Collapsible/Collapsible.module.css | 30 + .../original/Collapsible/Collapsible.test.tsx | 31 + .../original/Collapsible/Collapsible.tsx | 62 ++ .../tape/tests/original/Collapsible/index.ts | 1 + .../original/DateString/DateString.module.css | 1 + .../original/DateString/DateString.test.tsx | 35 + .../tests/original/DateString/DateString.tsx | 40 + .../tape/tests/original/DateString/index.ts | 1 + .../tape/tests/original/Icon/Icon.module.css | 1 + benchmarks/tape/tests/original/Icon/Icon.tsx | 48 + benchmarks/tape/tests/original/Icon/index.ts | 2 + .../original/Pagination/Pagination.module.css | 12 + .../original/Pagination/Pagination.test.tsx | 61 ++ .../tests/original/Pagination/Pagination.tsx | 84 ++ .../tape/tests/original/Pagination/index.ts | 1 + .../tests/original/Spinner/Spinner.module.css | 39 + .../tests/original/Spinner/Spinner.test.tsx | 12 + .../tape/tests/original/Spinner/Spinner.tsx | 45 + .../tape/tests/original/Spinner/index.ts | 1 + .../original/StatusBadge/StatusBadge.test.tsx | 13 + .../original/StatusBadge/StatusBadge.tsx | 25 + .../tape/tests/original/StatusBadge/index.ts | 1 + .../WithTooltip/WithTooltip.module.css | 25 + .../original/WithTooltip/WithTooltip.test.tsx | 15 + .../original/WithTooltip/WithTooltip.tsx | 165 ++++ .../tape/tests/original/WithTooltip/index.ts | 1 + benchmarks/tape/tsconfig.json | 9 + benchmarks/vitest/package.json | 14 +- bun.lockb | Bin 250668 -> 278737 bytes result-multi-thread.png | Bin 0 -> 17193 bytes result-single-thread.png | Bin 0 -> 16870 bytes results.png | Bin 13783 -> 0 bytes yarn.lock | 892 ++++++++++++++---- 68 files changed, 2326 insertions(+), 239 deletions(-) create mode 100644 benchmarks/tape/helpers/css.ts create mode 100644 benchmarks/tape/helpers/happydom.ts create mode 100644 benchmarks/tape/helpers/wrapper.ts create mode 100644 benchmarks/tape/package.json create mode 100644 benchmarks/tape/tests/.gitignore create mode 100644 benchmarks/tape/tests/original/Alert/Alert.module.css create mode 100644 benchmarks/tape/tests/original/Alert/Alert.test.tsx create mode 100644 benchmarks/tape/tests/original/Alert/Alert.tsx create mode 100644 benchmarks/tape/tests/original/Alert/index.ts create mode 100644 benchmarks/tape/tests/original/Avatar/Avatar.module.css create mode 100644 benchmarks/tape/tests/original/Avatar/Avatar.test.tsx create mode 100644 benchmarks/tape/tests/original/Avatar/Avatar.tsx create mode 100644 benchmarks/tape/tests/original/Avatar/index.ts create mode 100644 benchmarks/tape/tests/original/Badge/Badge.module.css create mode 100644 benchmarks/tape/tests/original/Badge/Badge.test.tsx create mode 100644 benchmarks/tape/tests/original/Badge/Badge.tsx create mode 100644 benchmarks/tape/tests/original/Badge/index.ts create mode 100644 benchmarks/tape/tests/original/Button/Button.module.css create mode 100644 benchmarks/tape/tests/original/Button/Button.tsx create mode 100644 benchmarks/tape/tests/original/Button/index.ts create mode 100644 benchmarks/tape/tests/original/Card/Card.module.css create mode 100644 benchmarks/tape/tests/original/Card/Card.test.tsx create mode 100644 benchmarks/tape/tests/original/Card/Card.tsx create mode 100644 benchmarks/tape/tests/original/Card/index.ts create mode 100644 benchmarks/tape/tests/original/Checkbox/Checkbox.module.css create mode 100644 benchmarks/tape/tests/original/Checkbox/Checkbox.test.tsx create mode 100644 benchmarks/tape/tests/original/Checkbox/Checkbox.tsx create mode 100644 benchmarks/tape/tests/original/Checkbox/index.ts create mode 100644 benchmarks/tape/tests/original/Collapsible/Collapsible.module.css create mode 100644 benchmarks/tape/tests/original/Collapsible/Collapsible.test.tsx create mode 100644 benchmarks/tape/tests/original/Collapsible/Collapsible.tsx create mode 100644 benchmarks/tape/tests/original/Collapsible/index.ts create mode 100644 benchmarks/tape/tests/original/DateString/DateString.module.css create mode 100644 benchmarks/tape/tests/original/DateString/DateString.test.tsx create mode 100644 benchmarks/tape/tests/original/DateString/DateString.tsx create mode 100644 benchmarks/tape/tests/original/DateString/index.ts create mode 100644 benchmarks/tape/tests/original/Icon/Icon.module.css create mode 100644 benchmarks/tape/tests/original/Icon/Icon.tsx create mode 100644 benchmarks/tape/tests/original/Icon/index.ts create mode 100644 benchmarks/tape/tests/original/Pagination/Pagination.module.css create mode 100644 benchmarks/tape/tests/original/Pagination/Pagination.test.tsx create mode 100644 benchmarks/tape/tests/original/Pagination/Pagination.tsx create mode 100644 benchmarks/tape/tests/original/Pagination/index.ts create mode 100644 benchmarks/tape/tests/original/Spinner/Spinner.module.css create mode 100644 benchmarks/tape/tests/original/Spinner/Spinner.test.tsx create mode 100644 benchmarks/tape/tests/original/Spinner/Spinner.tsx create mode 100644 benchmarks/tape/tests/original/Spinner/index.ts create mode 100644 benchmarks/tape/tests/original/StatusBadge/StatusBadge.test.tsx create mode 100644 benchmarks/tape/tests/original/StatusBadge/StatusBadge.tsx create mode 100644 benchmarks/tape/tests/original/StatusBadge/index.ts create mode 100644 benchmarks/tape/tests/original/WithTooltip/WithTooltip.module.css create mode 100644 benchmarks/tape/tests/original/WithTooltip/WithTooltip.test.tsx create mode 100644 benchmarks/tape/tests/original/WithTooltip/WithTooltip.tsx create mode 100644 benchmarks/tape/tests/original/WithTooltip/index.ts create mode 100644 benchmarks/tape/tsconfig.json create mode 100644 result-multi-thread.png create mode 100644 result-single-thread.png delete mode 100644 results.png 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 cac10e03ac9b72bef8d1e8190e7c995bca89d260..0a3a1794d872b63e6cbbcc84b33a3ee89e50d76e 100755 GIT binary patch delta 72537 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

tEvQ0JM<~5WsiA>_4iY#iC7mT$|J0zXP{0jJ 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

!1X6Ao1IBIC3q?ti`f;cra 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 Bq-y{G delta 56482 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%0DDo@PcU~ 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 BUEu%# literal 0 HcmV?d00001 diff --git a/result-single-thread.png b/result-single-thread.png new file mode 100644 index 0000000000000000000000000000000000000000..748b2325103d04975fdc47284c177256eeca6641 GIT binary patch literal 16870 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 F{{vyz>%jm3 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: