From 7cd18572eb7e4613f2d4a7b0a7cfdd9a6a21edb1 Mon Sep 17 00:00:00 2001 From: yamiteru Date: Tue, 14 Mar 2023 17:37:33 +0100 Subject: [PATCH] Implement better terminal output mode --- README.md | 175 ++++-- examples/arrayLoops.ts | 8 +- examples/emptyFunctions.ts | 8 +- package.json | 25 +- pnpm-lock.yaml | 1205 +++++++++++++++++------------------- src/constants.ts | 1 + src/events.ts | 24 + src/index.ts | 1 + src/modes/index.ts | 2 +- src/modes/modeMarkdown.ts | 61 -- src/modes/terminal.ts | 100 +++ src/preset.ts | 39 +- src/stats.ts | 3 +- src/types.ts | 13 +- src/utils/console.ts | 7 + src/utils/index.ts | 2 +- tsconfig.base.json | 2 +- 17 files changed, 915 insertions(+), 761 deletions(-) create mode 100644 src/events.ts delete mode 100644 src/modes/modeMarkdown.ts create mode 100644 src/modes/terminal.ts create mode 100644 src/utils/console.ts diff --git a/README.md b/README.md index 564e4b2..6cc7b4d 100644 --- a/README.md +++ b/README.md @@ -1,74 +1,159 @@ -# Benchpress +# Benchpress -Benchmarking TS library with V8 warmup and self-denoising for the most accurate results. +A modular benchmarking library with V8 warmup and cpu/ram denoising for the most accurate and consistent results. ## Features -- Waits until V8 optimizations kick in -- Gets rid of noise caused by the library itself -- Uses high resolution time in nanoseconds for more accurate op/s -- Reuses `UInt32Array`s for storing stat data for less memory noise -- Manually runs GC for more accurate memory stats -- Exposes lifecycle events for real-time data (`TODO`) -- Saves results into a markdown file (with SVG graphs - `TODO`) -- Shows basic stats and events in a terminal (`TODO`) -- Runs in interactive mode with all data/events/graphs (`TODO`) +- Waits until V8 optimizations kick in and benchmarks become less noisy +- Gets rid of performance noise caused by benchmark wrapper functions +- Reuses a couple of `UInt32Array`s to store stats for less memory noise +- Runs GC before every benchmark and suite for less memory noise +- Uses high resolution time in nanoseconds for more accurate cpu results +- Exposes lifecycle events listening to data in real-time +- Prints colorful benchmark results into a terminal +- Allows combining different output strategies (terminal/markdown/etc.) -## Example +## Installation + +```shell +yarn add benchpress +``` + +## Example ```ts -// you can pass options into the preset +import { preset } from "benchpress"; + +// define suite preset with options const defaultSuite = preset(); // define your suite with benchmarks -const testBenchmark = defaultSuite({ - emptyAsync: async () => { /* */ }, - emptySync: () => { /* */ } +const testBenchmark = defaultSuite("Test", { + emptyAsync: async () => {}, + emptySync: () => {}, +}); + +(async () => { + // collect data and print them into a terminal + useTerminal(); + + // run all benchmarks and trigger events + await testBenchmark(); +})(); +``` + +## API + +### `preset` + +Returns a `suite` preset with predefined options. + +```ts +const suite = preset({ + // options }); +``` -// run all benchmarks and log the results -for await (const result of testBenchmark()) { - console.log(result); +These are the default options: + +```ts +{ + cpu: { + chunkSize: 100, + compareSize: 10, + rangePercent: 10, + }, + ram: { + chunkSize: 5, + compareSize: 5, + rangePercent: 5, + }, + offset: { + allow: true, + rangePercent: 5, + }, + gc: { + allow: true, + } } ``` -## `TODO` API +### `suite` + +Returns a function which asynchronously runs all provided benchmarks. + +```ts +const runBenchmarks = suite("Name", { + // benchmarks +}); +``` + +Since all suites share the same references to internal objects you should never run multiple suites at the same time (not awaiting them). This is how multiple suites should be run: -## Notes +```ts +await firstSuite(); +await secondSuite(); +await thirdSuite(); +``` + +### `useTerminal` -`NOTE` I should probably create a section based on each one of these notes to describe things in more detail. +Listens to events and prints suite and benchmark results into a terminal. -- Since we use nanoseconds for measuring how long each function takes to execute and there is `1_000_000_00` nanoseconds in a second then the most op/s a benchmark can get is `1_000_000_000` (in such a case it means the function took <0, 1> nanoseconds to execute) -- Before any user defined benchmarks are run we run 4 hidden benchmarks (async-cpu, async-ram, sync-cpu, sync-ram) to determine the cost of the wrapper functions used for benchmark definitions and subtract those numbers from all of the user defined benchmarks (so if you benchmark an empty function it should give you 0ns and 0kbs since you're basically benchmarking nothing) +```ts +// subscribe to events +useTerminal(); -## Questions +// run suite which publishes data to the events +await runBenchmarks(); +``` -`NOTE` These are currently just my notes so I don't forget. +## Events -- Should I pass a specific name to a suite or require an object with suites as values for all of the modes? +The `suite` by itself doesn't return any data. For consuming suite and benchmarks data you should listen to events. All events are prefixed with `$`. -## `TODO` Modes +### `$suiteStart` -`NOTE` These are currently just my notes so I don't forget. +```ts +{ + suite: Name; + benchmarks: string[]; +} +``` + +### `$suiteOffsets` + +```ts +{ + suite: Name; + offsets: Offsets; +} +``` -### Markdown mode +### `$suiteEnd` -- Outputs markdown into a file (folder has to exist beforehand) -- Data should be in a table with all important data (currently just op/s and kbs) -- If possible should generate SVG graphs and include them into the markdown file (`TODO`) +```ts +{ + suite: Name; +} +``` -### `TODO` Static mode +### `$benchmarkStart` -- Shows real-time data but can't use keyboard -- Doesn't show a graph, only the basic info -- Should be clear what is happening at any given moment to let users know why they're waiting +```ts +{ + suite: Name; + benchmark: Name; +} +``` -### `TODO` Interactive mode +### `$benchmarkEnd` -- Shows real-time data from all benchmark iterations -- It should have different "screen" per each benchmark -- I can switch between different screens -- I should be able to also show all results in one big graph -- I should be able to restart a benchmark from the TUI -- The restart data should be merged instead of using the latest (maybe??) -- The cold part should have different color from the hot results +```ts +{ + suite: Name; + benchmark: Name; + cpu: Offset; + ram: Offset; +} +``` diff --git a/examples/arrayLoops.ts b/examples/arrayLoops.ts index 898c2fb..470c438 100644 --- a/examples/arrayLoops.ts +++ b/examples/arrayLoops.ts @@ -1,12 +1,12 @@ import { preset } from "../src"; -import { modeMarkdown } from "../src/modes"; +import { useTerminal } from "../src/modes"; const LENGTH = 1_000; const DATA = [...new Array(LENGTH)].map(() => Math.random() * 10); const RESULT = { _: 0 }; const defaultSuite = preset(); -const emptyFunctions = defaultSuite({ +const emptyFunctions = defaultSuite("Array loops", { for: () => { for (let i = 0; i < LENGTH; ++i) { RESULT._ = DATA[i]; @@ -30,5 +30,7 @@ const emptyFunctions = defaultSuite({ }); (async () => { - await modeMarkdown(emptyFunctions, "./examples/arrayLoops.md"); + useTerminal(); + + await emptyFunctions(); })(); diff --git a/examples/emptyFunctions.ts b/examples/emptyFunctions.ts index cb5d4b9..550df8c 100644 --- a/examples/emptyFunctions.ts +++ b/examples/emptyFunctions.ts @@ -1,8 +1,8 @@ import { preset } from "../src"; -import { modeMarkdown } from "../src/modes"; +import { useTerminal } from "../src/modes"; const defaultSuite = preset(); -const emptyFunctions = defaultSuite({ +const emptyFunctions = defaultSuite("Empty functions", { emptyAsync: async () => { /* */ }, @@ -12,5 +12,7 @@ const emptyFunctions = defaultSuite({ }); (async () => { - await modeMarkdown(emptyFunctions, "./examples/emptyFunctions.md"); + useTerminal(); + + await emptyFunctions(); })(); diff --git a/package.json b/package.json index a26b59a..768369e 100644 --- a/package.json +++ b/package.json @@ -30,24 +30,29 @@ "devDependencies": { "@release-it/keep-a-changelog": "3.1.0", "@swc/cli": "0.1.62", - "@swc/core": "1.3.35", + "@swc/core": "1.3.40", "@swc/helpers": "0.4.14", - "@types/jest": "29.4.0", - "@types/node": "18.13.0", - "@typescript-eslint/eslint-plugin": "5.52.0", - "@typescript-eslint/parser": "5.52.0", + "@types/jest": "29.4.1", + "@types/node": "18.15.3", + "@typescript-eslint/eslint-plugin": "5.55.0", + "@typescript-eslint/parser": "5.55.0", "auto-changelog": "2.4.0", - "esbuild": "0.17.8", + "chalk": "4.1.2", + "esbuild": "0.17.11", "esbuild-plugin-swc": "1.0.1", - "eslint": "8.34.0", - "eslint-config-prettier": "8.6.0", + "eslint": "8.36.0", + "eslint-config-prettier": "8.7.0", "husky": "8.0.3", - "jest": "29.4.3", + "jest": "29.5.0", "npm-dts": "1.3.12", "prettier": "2.8.4", - "release-it": "15.6.0", + "release-it": "15.8.0", "ts-jest": "29.0.5", "ts-node": "10.9.1", "typescript": "next" + }, + "dependencies": { + "elfs": "0.0.7", + "ueve": "1.2.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a4b1a7a..3f44345 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3,48 +3,56 @@ lockfileVersion: 5.4 specifiers: '@release-it/keep-a-changelog': 3.1.0 '@swc/cli': 0.1.62 - '@swc/core': 1.3.35 + '@swc/core': 1.3.40 '@swc/helpers': 0.4.14 - '@types/jest': 29.4.0 - '@types/node': 18.13.0 - '@typescript-eslint/eslint-plugin': 5.52.0 - '@typescript-eslint/parser': 5.52.0 + '@types/jest': 29.4.1 + '@types/node': 18.15.3 + '@typescript-eslint/eslint-plugin': 5.55.0 + '@typescript-eslint/parser': 5.55.0 auto-changelog: 2.4.0 - esbuild: 0.17.8 + chalk: 4.1.2 + elfs: 0.0.7 + esbuild: 0.17.11 esbuild-plugin-swc: 1.0.1 - eslint: 8.34.0 - eslint-config-prettier: 8.6.0 + eslint: 8.36.0 + eslint-config-prettier: 8.7.0 husky: 8.0.3 - jest: 29.4.3 + jest: 29.5.0 npm-dts: 1.3.12 prettier: 2.8.4 - release-it: 15.6.0 + release-it: 15.8.0 ts-jest: 29.0.5 ts-node: 10.9.1 typescript: next + ueve: 1.2.2 + +dependencies: + elfs: 0.0.7 + ueve: 1.2.2 devDependencies: - '@release-it/keep-a-changelog': 3.1.0_release-it@15.6.0 - '@swc/cli': 0.1.62_@swc+core@1.3.35 - '@swc/core': 1.3.35 + '@release-it/keep-a-changelog': 3.1.0_release-it@15.8.0 + '@swc/cli': 0.1.62_@swc+core@1.3.40 + '@swc/core': 1.3.40 '@swc/helpers': 0.4.14 - '@types/jest': 29.4.0 - '@types/node': 18.13.0 - '@typescript-eslint/eslint-plugin': 5.52.0_ztklytm4bn76xg7iayqqmkhuka - '@typescript-eslint/parser': 5.52.0_xkpid3yoisizbf5i4jpmwuknpy + '@types/jest': 29.4.1 + '@types/node': 18.15.3 + '@typescript-eslint/eslint-plugin': 5.55.0_3x3un3wo2noupza6oxjpuhskge + '@typescript-eslint/parser': 5.55.0_o7jyplx7gatjz5hr5kke5hclw4 auto-changelog: 2.4.0 - esbuild: 0.17.8 + chalk: 4.1.2 + esbuild: 0.17.11 esbuild-plugin-swc: 1.0.1 - eslint: 8.34.0 - eslint-config-prettier: 8.6.0_eslint@8.34.0 + eslint: 8.36.0 + eslint-config-prettier: 8.7.0_eslint@8.36.0 husky: 8.0.3 - jest: 29.4.3_ucpl6toqp57nqodtp3vxxi6g5a + jest: 29.5.0_d2dllaz5dte7avnjm55wl7fmsu npm-dts: 1.3.12 prettier: 2.8.4 - release-it: 15.6.0 - ts-jest: 29.0.5_evw3tzrdq7gev6sd56epgi5xke - ts-node: 10.9.1_igpqvytqs6nfxuvrz6echdviki - typescript: 5.0.0-dev.20230219 + release-it: 15.8.0 + ts-jest: 29.0.5_qqi5a5dl4dto2lhpz6h6vqbhoi + ts-node: 10.9.1_ba4srlkyyscguoqwtln5uyiwo4 + typescript: 5.1.0-dev.20230313 packages: @@ -407,8 +415,8 @@ packages: kuler: 2.0.0 dev: true - /@esbuild/android-arm/0.17.8: - resolution: {integrity: sha512-0/rb91GYKhrtbeglJXOhAv9RuYimgI8h623TplY2X+vA4EXnk3Zj1fXZreJ0J3OJJu1bwmb0W7g+2cT/d8/l/w==} + /@esbuild/android-arm/0.17.11: + resolution: {integrity: sha512-CdyX6sRVh1NzFCsf5vw3kULwlAhfy9wVt8SZlrhQ7eL2qBjGbFhRBWkkAzuZm9IIEOCKJw4DXA6R85g+qc8RDw==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -416,8 +424,8 @@ packages: dev: true optional: true - /@esbuild/android-arm64/0.17.8: - resolution: {integrity: sha512-oa/N5j6v1svZQs7EIRPqR8f+Bf8g6HBDjD/xHC02radE/NjKHK7oQmtmLxPs1iVwYyvE+Kolo6lbpfEQ9xnhxQ==} + /@esbuild/android-arm64/0.17.11: + resolution: {integrity: sha512-QnK4d/zhVTuV4/pRM4HUjcsbl43POALU2zvBynmrrqZt9LPcLA3x1fTZPBg2RRguBQnJcnU059yKr+bydkntjg==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -425,8 +433,8 @@ packages: dev: true optional: true - /@esbuild/android-x64/0.17.8: - resolution: {integrity: sha512-bTliMLqD7pTOoPg4zZkXqCDuzIUguEWLpeqkNfC41ODBHwoUgZ2w5JBeYimv4oP6TDVocoYmEhZrCLQTrH89bg==} + /@esbuild/android-x64/0.17.11: + resolution: {integrity: sha512-3PL3HKtsDIXGQcSCKtWD/dy+mgc4p2Tvo2qKgKHj9Yf+eniwFnuoQ0OUhlSfAEpKAFzF9N21Nwgnap6zy3L3MQ==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -434,8 +442,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64/0.17.8: - resolution: {integrity: sha512-ghAbV3ia2zybEefXRRm7+lx8J/rnupZT0gp9CaGy/3iolEXkJ6LYRq4IpQVI9zR97ID80KJVoUlo3LSeA/sMAg==} + /@esbuild/darwin-arm64/0.17.11: + resolution: {integrity: sha512-pJ950bNKgzhkGNO3Z9TeHzIFtEyC2GDQL3wxkMApDEghYx5Qers84UTNc1bAxWbRkuJOgmOha5V0WUeh8G+YGw==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -443,8 +451,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64/0.17.8: - resolution: {integrity: sha512-n5WOpyvZ9TIdv2V1K3/iIkkJeKmUpKaCTdun9buhGRWfH//osmUjlv4Z5mmWdPWind/VGcVxTHtLfLCOohsOXw==} + /@esbuild/darwin-x64/0.17.11: + resolution: {integrity: sha512-iB0dQkIHXyczK3BZtzw1tqegf0F0Ab5texX2TvMQjiJIWXAfM4FQl7D909YfXWnB92OQz4ivBYQ2RlxBJrMJOw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -452,8 +460,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64/0.17.8: - resolution: {integrity: sha512-a/SATTaOhPIPFWvHZDoZYgxaZRVHn0/LX1fHLGfZ6C13JqFUZ3K6SMD6/HCtwOQ8HnsNaEeokdiDSFLuizqv5A==} + /@esbuild/freebsd-arm64/0.17.11: + resolution: {integrity: sha512-7EFzUADmI1jCHeDRGKgbnF5sDIceZsQGapoO6dmw7r/ZBEKX7CCDnIz8m9yEclzr7mFsd+DyasHzpjfJnmBB1Q==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -461,8 +469,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64/0.17.8: - resolution: {integrity: sha512-xpFJb08dfXr5+rZc4E+ooZmayBW6R3q59daCpKZ/cDU96/kvDM+vkYzNeTJCGd8rtO6fHWMq5Rcv/1cY6p6/0Q==} + /@esbuild/freebsd-x64/0.17.11: + resolution: {integrity: sha512-iPgenptC8i8pdvkHQvXJFzc1eVMR7W2lBPrTE6GbhR54sLcF42mk3zBOjKPOodezzuAz/KSu8CPyFSjcBMkE9g==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -470,8 +478,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm/0.17.8: - resolution: {integrity: sha512-6Ij8gfuGszcEwZpi5jQIJCVIACLS8Tz2chnEBfYjlmMzVsfqBP1iGmHQPp7JSnZg5xxK9tjCc+pJ2WtAmPRFVA==} + /@esbuild/linux-arm/0.17.11: + resolution: {integrity: sha512-M9iK/d4lgZH0U5M1R2p2gqhPV/7JPJcRz+8O8GBKVgqndTzydQ7B2XGDbxtbvFkvIs53uXTobOhv+RyaqhUiMg==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -479,8 +487,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64/0.17.8: - resolution: {integrity: sha512-v3iwDQuDljLTxpsqQDl3fl/yihjPAyOguxuloON9kFHYwopeJEf1BkDXODzYyXEI19gisEsQlG1bM65YqKSIww==} + /@esbuild/linux-arm64/0.17.11: + resolution: {integrity: sha512-Qxth3gsWWGKz2/qG2d5DsW/57SeA2AmpSMhdg9TSB5Svn2KDob3qxfQSkdnWjSd42kqoxIPy3EJFs+6w1+6Qjg==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -488,8 +496,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32/0.17.8: - resolution: {integrity: sha512-8svILYKhE5XetuFk/B6raFYIyIqydQi+GngEXJgdPdI7OMKUbSd7uzR02wSY4kb53xBrClLkhH4Xs8P61Q2BaA==} + /@esbuild/linux-ia32/0.17.11: + resolution: {integrity: sha512-dB1nGaVWtUlb/rRDHmuDQhfqazWE0LMro/AIbT2lWM3CDMHJNpLckH+gCddQyhhcLac2OYw69ikUMO34JLt3wA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -497,8 +505,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64/0.17.8: - resolution: {integrity: sha512-B6FyMeRJeV0NpyEOYlm5qtQfxbdlgmiGdD+QsipzKfFky0K5HW5Td6dyK3L3ypu1eY4kOmo7wW0o94SBqlqBSA==} + /@esbuild/linux-loong64/0.17.11: + resolution: {integrity: sha512-aCWlq70Q7Nc9WDnormntGS1ar6ZFvUpqr8gXtO+HRejRYPweAFQN615PcgaSJkZjhHp61+MNLhzyVALSF2/Q0g==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -506,8 +514,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el/0.17.8: - resolution: {integrity: sha512-CCb67RKahNobjm/eeEqeD/oJfJlrWyw29fgiyB6vcgyq97YAf3gCOuP6qMShYSPXgnlZe/i4a8WFHBw6N8bYAA==} + /@esbuild/linux-mips64el/0.17.11: + resolution: {integrity: sha512-cGeGNdQxqY8qJwlYH1BP6rjIIiEcrM05H7k3tR7WxOLmD1ZxRMd6/QIOWMb8mD2s2YJFNRuNQ+wjMhgEL2oCEw==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -515,8 +523,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64/0.17.8: - resolution: {integrity: sha512-bytLJOi55y55+mGSdgwZ5qBm0K9WOCh0rx+vavVPx+gqLLhxtSFU0XbeYy/dsAAD6xECGEv4IQeFILaSS2auXw==} + /@esbuild/linux-ppc64/0.17.11: + resolution: {integrity: sha512-BdlziJQPW/bNe0E8eYsHB40mYOluS+jULPCjlWiHzDgr+ZBRXPtgMV1nkLEGdpjrwgmtkZHEGEPaKdS/8faLDA==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -524,8 +532,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64/0.17.8: - resolution: {integrity: sha512-2YpRyQJmKVBEHSBLa8kBAtbhucaclb6ex4wchfY0Tj3Kg39kpjeJ9vhRU7x4mUpq8ISLXRXH1L0dBYjAeqzZAw==} + /@esbuild/linux-riscv64/0.17.11: + resolution: {integrity: sha512-MDLwQbtF+83oJCI1Cixn68Et/ME6gelmhssPebC40RdJaect+IM+l7o/CuG0ZlDs6tZTEIoxUe53H3GmMn8oMA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -533,8 +541,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x/0.17.8: - resolution: {integrity: sha512-QgbNY/V3IFXvNf11SS6exkpVcX0LJcob+0RWCgV9OiDAmVElnxciHIisoSix9uzYzScPmS6dJFbZULdSAEkQVw==} + /@esbuild/linux-s390x/0.17.11: + resolution: {integrity: sha512-4N5EMESvws0Ozr2J94VoUD8HIRi7X0uvUv4c0wpTHZyZY9qpaaN7THjosdiW56irQ4qnJ6Lsc+i+5zGWnyqWqQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -542,8 +550,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64/0.17.8: - resolution: {integrity: sha512-mM/9S0SbAFDBc4OPoyP6SEOo5324LpUxdpeIUUSrSTOfhHU9hEfqRngmKgqILqwx/0DVJBzeNW7HmLEWp9vcOA==} + /@esbuild/linux-x64/0.17.11: + resolution: {integrity: sha512-rM/v8UlluxpytFSmVdbCe1yyKQd/e+FmIJE2oPJvbBo+D0XVWi1y/NQ4iTNx+436WmDHQBjVLrbnAQLQ6U7wlw==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -551,8 +559,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64/0.17.8: - resolution: {integrity: sha512-eKUYcWaWTaYr9zbj8GertdVtlt1DTS1gNBWov+iQfWuWyuu59YN6gSEJvFzC5ESJ4kMcKR0uqWThKUn5o8We6Q==} + /@esbuild/netbsd-x64/0.17.11: + resolution: {integrity: sha512-4WaAhuz5f91h3/g43VBGdto1Q+X7VEZfpcWGtOFXnggEuLvjV+cP6DyLRU15IjiU9fKLLk41OoJfBFN5DhPvag==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -560,8 +568,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64/0.17.8: - resolution: {integrity: sha512-Vc9J4dXOboDyMXKD0eCeW0SIeEzr8K9oTHJU+Ci1mZc5njPfhKAqkRt3B/fUNU7dP+mRyralPu8QUkiaQn7iIg==} + /@esbuild/openbsd-x64/0.17.11: + resolution: {integrity: sha512-UBj135Nx4FpnvtE+C8TWGp98oUgBcmNmdYgl5ToKc0mBHxVVqVE7FUS5/ELMImOp205qDAittL6Ezhasc2Ev/w==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -569,8 +577,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64/0.17.8: - resolution: {integrity: sha512-0xvOTNuPXI7ft1LYUgiaXtpCEjp90RuBBYovdd2lqAFxje4sEucurg30M1WIm03+3jxByd3mfo+VUmPtRSVuOw==} + /@esbuild/sunos-x64/0.17.11: + resolution: {integrity: sha512-1/gxTifDC9aXbV2xOfCbOceh5AlIidUrPsMpivgzo8P8zUtczlq1ncFpeN1ZyQJ9lVs2hILy1PG5KPp+w8QPPg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -578,8 +586,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64/0.17.8: - resolution: {integrity: sha512-G0JQwUI5WdEFEnYNKzklxtBheCPkuDdu1YrtRrjuQv30WsYbkkoixKxLLv8qhJmNI+ATEWquZe/N0d0rpr55Mg==} + /@esbuild/win32-arm64/0.17.11: + resolution: {integrity: sha512-vtSfyx5yRdpiOW9yp6Ax0zyNOv9HjOAw8WaZg3dF5djEHKKm3UnoohftVvIJtRh0Ec7Hso0RIdTqZvPXJ7FdvQ==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -587,8 +595,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32/0.17.8: - resolution: {integrity: sha512-Fqy63515xl20OHGFykjJsMnoIWS+38fqfg88ClvPXyDbLtgXal2DTlhb1TfTX34qWi3u4I7Cq563QcHpqgLx8w==} + /@esbuild/win32-ia32/0.17.11: + resolution: {integrity: sha512-GFPSLEGQr4wHFTiIUJQrnJKZhZjjq4Sphf+mM76nQR6WkQn73vm7IsacmBRPkALfpOCHsopSvLgqdd4iUW2mYw==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -596,8 +604,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64/0.17.8: - resolution: {integrity: sha512-1iuezdyDNngPnz8rLRDO2C/ZZ/emJLb72OsZeqQ6gL6Avko/XCXZw+NuxBSNhBAP13Hie418V7VMt9et1FMvpg==} + /@esbuild/win32-x64/0.17.11: + resolution: {integrity: sha512-N9vXqLP3eRL8BqSy8yn4Y98cZI2pZ8fyuHx6lKjiG2WABpT2l01TXdzq5Ma2ZUBzfB7tx5dXVhge8X9u0S70ZQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -605,13 +613,28 @@ packages: dev: true optional: true - /@eslint/eslintrc/1.4.1: - resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} + /@eslint-community/eslint-utils/4.2.0_eslint@8.36.0: + resolution: {integrity: sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.36.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /@eslint-community/regexpp/4.4.0: + resolution: {integrity: sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc/2.0.1: + resolution: {integrity: sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.4.1 + espree: 9.5.0 globals: 13.20.0 ignore: 5.2.0 import-fresh: 3.3.0 @@ -622,6 +645,11 @@ packages: - supports-color dev: true + /@eslint/js/8.36.0: + resolution: {integrity: sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@humanwhocodes/config-array/0.11.8: resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} engines: {node: '>=10.10.0'} @@ -662,20 +690,20 @@ packages: engines: {node: '>=8'} dev: true - /@jest/console/29.4.3: - resolution: {integrity: sha512-W/o/34+wQuXlgqlPYTansOSiBnuxrTv61dEVkA6HNmpcgHLUjfaUbdqt6oVvOzaawwo9IdW9QOtMgQ1ScSZC4A==} + /@jest/console/29.5.0: + resolution: {integrity: sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.4.3 - '@types/node': 18.13.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.3 chalk: 4.1.2 - jest-message-util: 29.4.3 - jest-util: 29.4.3 + jest-message-util: 29.5.0 + jest-util: 29.5.0 slash: 3.0.0 dev: true - /@jest/core/29.4.3_ts-node@10.9.1: - resolution: {integrity: sha512-56QvBq60fS4SPZCuM7T+7scNrkGIe7Mr6PVIXUpu48ouvRaWOFqRPV91eifvFM0ay2HmfswXiGf97NGUN5KofQ==} + /@jest/core/29.5.0_ts-node@10.9.1: + resolution: {integrity: sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -683,32 +711,32 @@ packages: node-notifier: optional: true dependencies: - '@jest/console': 29.4.3 - '@jest/reporters': 29.4.3 - '@jest/test-result': 29.4.3 - '@jest/transform': 29.4.3 - '@jest/types': 29.4.3 - '@types/node': 18.13.0 + '@jest/console': 29.5.0 + '@jest/reporters': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.3 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.6.1 exit: 0.1.2 graceful-fs: 4.2.10 - jest-changed-files: 29.4.3 - jest-config: 29.4.3_ucpl6toqp57nqodtp3vxxi6g5a - jest-haste-map: 29.4.3 - jest-message-util: 29.4.3 + jest-changed-files: 29.5.0 + jest-config: 29.5.0_d2dllaz5dte7avnjm55wl7fmsu + jest-haste-map: 29.5.0 + jest-message-util: 29.5.0 jest-regex-util: 29.4.3 - jest-resolve: 29.4.3 - jest-resolve-dependencies: 29.4.3 - jest-runner: 29.4.3 - jest-runtime: 29.4.3 - jest-snapshot: 29.4.3 - jest-util: 29.4.3 - jest-validate: 29.4.3 - jest-watcher: 29.4.3 + jest-resolve: 29.5.0 + jest-resolve-dependencies: 29.5.0 + jest-runner: 29.5.0 + jest-runtime: 29.5.0 + jest-snapshot: 29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 + jest-watcher: 29.5.0 micromatch: 4.0.5 - pretty-format: 29.4.3 + pretty-format: 29.5.0 slash: 3.0.0 strip-ansi: 6.0.1 transitivePeerDependencies: @@ -716,66 +744,59 @@ packages: - ts-node dev: true - /@jest/environment/29.4.3: - resolution: {integrity: sha512-dq5S6408IxIa+lr54zeqce+QgI+CJT4nmmA+1yzFgtcsGK8c/EyiUb9XQOgz3BMKrRDfKseeOaxj2eO8LlD3lA==} + /@jest/environment/29.5.0: + resolution: {integrity: sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/fake-timers': 29.4.3 - '@jest/types': 29.4.3 - '@types/node': 18.13.0 - jest-mock: 29.4.3 + '@jest/fake-timers': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.3 + jest-mock: 29.5.0 dev: true - /@jest/expect-utils/29.3.1: - resolution: {integrity: sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.2.0 - dev: true - - /@jest/expect-utils/29.4.3: - resolution: {integrity: sha512-/6JWbkxHOP8EoS8jeeTd9dTfc9Uawi+43oLKHfp6zzux3U2hqOOVnV3ai4RpDYHOccL6g+5nrxpoc8DmJxtXVQ==} + /@jest/expect-utils/29.5.0: + resolution: {integrity: sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.4.3 dev: true - /@jest/expect/29.4.3: - resolution: {integrity: sha512-iktRU/YsxEtumI9zsPctYUk7ptpC+AVLLk1Ax3AsA4g1C+8OOnKDkIQBDHtD5hA/+VtgMd5AWI5gNlcAlt2vxQ==} + /@jest/expect/29.5.0: + resolution: {integrity: sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - expect: 29.4.3 - jest-snapshot: 29.4.3 + expect: 29.5.0 + jest-snapshot: 29.5.0 transitivePeerDependencies: - supports-color dev: true - /@jest/fake-timers/29.4.3: - resolution: {integrity: sha512-4Hote2MGcCTWSD2gwl0dwbCpBRHhE6olYEuTj8FMowdg3oQWNKr2YuxenPQYZ7+PfqPY1k98wKDU4Z+Hvd4Tiw==} + /@jest/fake-timers/29.5.0: + resolution: {integrity: sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.4.3 + '@jest/types': 29.5.0 '@sinonjs/fake-timers': 10.0.2 - '@types/node': 18.13.0 - jest-message-util: 29.4.3 - jest-mock: 29.4.3 - jest-util: 29.4.3 + '@types/node': 18.15.3 + jest-message-util: 29.5.0 + jest-mock: 29.5.0 + jest-util: 29.5.0 dev: true - /@jest/globals/29.4.3: - resolution: {integrity: sha512-8BQ/5EzfOLG7AaMcDh7yFCbfRLtsc+09E1RQmRBI4D6QQk4m6NSK/MXo+3bJrBN0yU8A2/VIcqhvsOLFmziioA==} + /@jest/globals/29.5.0: + resolution: {integrity: sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.4.3 - '@jest/expect': 29.4.3 - '@jest/types': 29.4.3 - jest-mock: 29.4.3 + '@jest/environment': 29.5.0 + '@jest/expect': 29.5.0 + '@jest/types': 29.5.0 + jest-mock: 29.5.0 transitivePeerDependencies: - supports-color dev: true - /@jest/reporters/29.4.3: - resolution: {integrity: sha512-sr2I7BmOjJhyqj9ANC6CTLsL4emMoka7HkQpcoMRlhCbQJjz2zsRzw0BDPiPyEFDXAbxKgGFYuQZiSJ1Y6YoTg==} + /@jest/reporters/29.5.0: + resolution: {integrity: sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -784,12 +805,12 @@ packages: optional: true dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.4.3 - '@jest/test-result': 29.4.3 - '@jest/transform': 29.4.3 - '@jest/types': 29.4.3 + '@jest/console': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 '@jridgewell/trace-mapping': 0.3.17 - '@types/node': 18.13.0 + '@types/node': 18.15.3 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -800,9 +821,9 @@ packages: istanbul-lib-report: 3.0.0 istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.1.5 - jest-message-util: 29.4.3 - jest-util: 29.4.3 - jest-worker: 29.4.3 + jest-message-util: 29.5.0 + jest-util: 29.5.0 + jest-worker: 29.5.0 slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 @@ -811,13 +832,6 @@ packages: - supports-color dev: true - /@jest/schemas/29.0.0: - resolution: {integrity: sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.24.51 - dev: true - /@jest/schemas/29.4.3: resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -834,41 +848,41 @@ packages: graceful-fs: 4.2.10 dev: true - /@jest/test-result/29.4.3: - resolution: {integrity: sha512-Oi4u9NfBolMq9MASPwuWTlC5WvmNRwI4S8YrQg5R5Gi47DYlBe3sh7ILTqi/LGrK1XUE4XY9KZcQJTH1WJCLLA==} + /@jest/test-result/29.5.0: + resolution: {integrity: sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.4.3 - '@jest/types': 29.4.3 + '@jest/console': 29.5.0 + '@jest/types': 29.5.0 '@types/istanbul-lib-coverage': 2.0.4 collect-v8-coverage: 1.0.1 dev: true - /@jest/test-sequencer/29.4.3: - resolution: {integrity: sha512-yi/t2nES4GB4G0mjLc0RInCq/cNr9dNwJxcGg8sslajua5Kb4kmozAc+qPLzplhBgfw1vLItbjyHzUN92UXicw==} + /@jest/test-sequencer/29.5.0: + resolution: {integrity: sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 29.4.3 + '@jest/test-result': 29.5.0 graceful-fs: 4.2.10 - jest-haste-map: 29.4.3 + jest-haste-map: 29.5.0 slash: 3.0.0 dev: true - /@jest/transform/29.4.3: - resolution: {integrity: sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg==} + /@jest/transform/29.5.0: + resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/core': 7.20.2 - '@jest/types': 29.4.3 + '@jest/types': 29.5.0 '@jridgewell/trace-mapping': 0.3.17 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.10 - jest-haste-map: 29.4.3 + jest-haste-map: 29.5.0 jest-regex-util: 29.4.3 - jest-util: 29.4.3 + jest-util: 29.5.0 micromatch: 4.0.5 pirates: 4.0.5 slash: 3.0.0 @@ -884,7 +898,19 @@ packages: '@jest/schemas': 29.4.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.13.0 + '@types/node': 18.15.3 + '@types/yargs': 17.0.13 + chalk: 4.1.2 + dev: true + + /@jest/types/29.5.0: + resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.4.3 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 18.15.3 '@types/yargs': 17.0.13 chalk: 4.1.2 dev: true @@ -1015,14 +1041,18 @@ packages: resolution: {integrity: sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw==} dev: true - /@octokit/plugin-paginate-rest/5.0.1_@octokit+core@4.1.0: - resolution: {integrity: sha512-7A+rEkS70pH36Z6JivSlR7Zqepz3KVucEFVDnSrgHXzG7WLAzYwcHZbKdfTXHwuTHbkT1vKvz7dHl1+HNf6Qyw==} + /@octokit/openapi-types/16.0.0: + resolution: {integrity: sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA==} + dev: true + + /@octokit/plugin-paginate-rest/6.0.0_@octokit+core@4.1.0: + resolution: {integrity: sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw==} engines: {node: '>= 14'} peerDependencies: '@octokit/core': '>=4' dependencies: '@octokit/core': 4.1.0 - '@octokit/types': 8.0.0 + '@octokit/types': 9.0.0 dev: true /@octokit/plugin-request-log/1.0.4_@octokit+core@4.1.0: @@ -1033,14 +1063,14 @@ packages: '@octokit/core': 4.1.0 dev: true - /@octokit/plugin-rest-endpoint-methods/6.7.0_@octokit+core@4.1.0: - resolution: {integrity: sha512-orxQ0fAHA7IpYhG2flD2AygztPlGYNAdlzYz8yrD8NDgelPfOYoRPROfEyIe035PlxvbYrgkfUZIhSBKju/Cvw==} + /@octokit/plugin-rest-endpoint-methods/7.0.1_@octokit+core@4.1.0: + resolution: {integrity: sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA==} engines: {node: '>= 14'} peerDependencies: '@octokit/core': '>=3' dependencies: '@octokit/core': 4.1.0 - '@octokit/types': 8.0.0 + '@octokit/types': 9.0.0 deprecation: 2.3.1 dev: true @@ -1067,14 +1097,14 @@ packages: - encoding dev: true - /@octokit/rest/19.0.5: - resolution: {integrity: sha512-+4qdrUFq2lk7Va+Qff3ofREQWGBeoTKNqlJO+FGjFP35ZahP+nBenhZiGdu8USSgmq4Ky3IJ/i4u0xbLqHaeow==} + /@octokit/rest/19.0.7: + resolution: {integrity: sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==} engines: {node: '>= 14'} dependencies: '@octokit/core': 4.1.0 - '@octokit/plugin-paginate-rest': 5.0.1_@octokit+core@4.1.0 + '@octokit/plugin-paginate-rest': 6.0.0_@octokit+core@4.1.0 '@octokit/plugin-request-log': 1.0.4_@octokit+core@4.1.0 - '@octokit/plugin-rest-endpoint-methods': 6.7.0_@octokit+core@4.1.0 + '@octokit/plugin-rest-endpoint-methods': 7.0.1_@octokit+core@4.1.0 transitivePeerDependencies: - encoding dev: true @@ -1085,6 +1115,12 @@ packages: '@octokit/openapi-types': 14.0.0 dev: true + /@octokit/types/9.0.0: + resolution: {integrity: sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==} + dependencies: + '@octokit/openapi-types': 16.0.0 + dev: true + /@pnpm/network.ca-file/1.0.1: resolution: {integrity: sha512-gkINruT2KUhZLTaiHxwCOh1O4NVnFT0wLjWFBHmTz9vpKag/C/noIMJXBxFe4F0mYpUVX2puLwAieLYFg2NvoA==} engines: {node: '>=12.22.0'} @@ -1100,21 +1136,17 @@ packages: config-chain: 1.1.13 dev: true - /@release-it/keep-a-changelog/3.1.0_release-it@15.6.0: + /@release-it/keep-a-changelog/3.1.0_release-it@15.8.0: resolution: {integrity: sha512-o8lxZCAFwFkFpo88aIIgS5dR3kDy6yLjJVpe9QAGNY6tpKMMRHxsiJ8MS5NvrEeIC2VTzOoOjN/CDvdd3a4+/A==} engines: {node: '>=14'} peerDependencies: release-it: ^15.0.0-esm.4 dependencies: detect-newline: 4.0.0 - release-it: 15.6.0 + release-it: 15.8.0 string-template: 1.0.0 dev: true - /@sinclair/typebox/0.24.51: - resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} - dev: true - /@sinclair/typebox/0.25.23: resolution: {integrity: sha512-VEB8ygeP42CFLWyAJhN5OklpxUliqdNEUcXb4xZ/CINqtYGTjL5ukluKdKzQ0iWdUxyQ7B0539PAUhHKrCNWSQ==} dev: true @@ -1141,7 +1173,7 @@ packages: '@sinonjs/commons': 2.0.0 dev: true - /@swc/cli/0.1.62_@swc+core@1.3.35: + /@swc/cli/0.1.62_@swc+core@1.3.40: resolution: {integrity: sha512-kOFLjKY3XH1DWLfXL1/B5MizeNorHR8wHKEi92S/Zi9Md/AK17KSqR8MgyRJ6C1fhKHvbBCl8wboyKAFXStkYw==} engines: {node: '>= 12.13'} hasBin: true @@ -1153,7 +1185,7 @@ packages: optional: true dependencies: '@mole-inc/bin-wrapper': 8.0.1 - '@swc/core': 1.3.35 + '@swc/core': 1.3.40 commander: 7.2.0 fast-glob: 3.2.12 semver: 7.3.8 @@ -1161,8 +1193,8 @@ packages: source-map: 0.7.4 dev: true - /@swc/core-darwin-arm64/1.3.35: - resolution: {integrity: sha512-zQUFkHx4gZpu0uo2IspvPnKsz8bsdXd5bC33xwjtoAI1cpLerDyqo4v2zIahEp+FdKZjyVsLHtfJiQiA1Qka3A==} + /@swc/core-darwin-arm64/1.3.40: + resolution: {integrity: sha512-x4JHshTVB2o5xOedLL54/jsKkfUlsMw25tNM5fWkehiKWXlQuxEasl5/roceAFETWm8mEESuL8pWgZaiyTDl4Q==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] @@ -1170,8 +1202,8 @@ packages: dev: true optional: true - /@swc/core-darwin-x64/1.3.35: - resolution: {integrity: sha512-oOSkSGWtALovaw22lNevKD434OQTPf8X+dVPvPMrJXJpJ34dWDlFWpLntoc+arvKLNZ7LQmTuk8rR1hkrAY7cw==} + /@swc/core-darwin-x64/1.3.40: + resolution: {integrity: sha512-2QaW9HtlvatiQscQACVIyKtj+vAEFEC6Tn+8rqxm8ikYHUD33M/FVXGWEvMLTI7T3P25zjhs+toAlLsjHgfzQQ==} engines: {node: '>=10'} cpu: [x64] os: [darwin] @@ -1179,8 +1211,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm-gnueabihf/1.3.35: - resolution: {integrity: sha512-Yie8k00O6O8BCATS/xeKStquV4OYSskUGRDXBQVDw1FrE23PHaSeHCgg4q6iNZjJzXCOJbaTCKnYoIDn9DMf7A==} + /@swc/core-linux-arm-gnueabihf/1.3.40: + resolution: {integrity: sha512-cJPgSg8222gezj5Db2S8PNvcALJLokvXqvFjyzRR253SMFFkq9JKWk0uwO3wg8i8jhe78xMB6EO6AteQqFWvCg==} engines: {node: '>=10'} cpu: [arm] os: [linux] @@ -1188,8 +1220,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-gnu/1.3.35: - resolution: {integrity: sha512-Zlv3WHa/4x2p51HSvjUWXHfSe1Gl2prqImUZJc8NZOlj75BFzVuR0auhQ+LbwvIQ3gaA1LODX9lyS9wXL3yjxA==} + /@swc/core-linux-arm64-gnu/1.3.40: + resolution: {integrity: sha512-s76n4/vpQzV7dpS703m1WnCxyG7OfGk+EeJf+KEl/m6KP7c5MHHOLOf8hpagI/QI1H8jb9j1ADqNu2C7tEUR8Q==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -1197,8 +1229,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-musl/1.3.35: - resolution: {integrity: sha512-u6tCYsrSyZ8U+4jLMA/O82veBfLy2aUpn51WxQaeH7wqZGy9TGSJXoO8vWxARQ6b72vjsnKDJHP4MD8hFwcctg==} + /@swc/core-linux-arm64-musl/1.3.40: + resolution: {integrity: sha512-aTkeImCq1WrkljAQNnqlbk/1ermotONkBl11GH7Ia+8yhsmgt8ZiNBIi0tJ5UjdfXDtnl58Iek43Vo8LWaPUKA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -1206,8 +1238,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-gnu/1.3.35: - resolution: {integrity: sha512-Dtxf2IbeH7XlNhP1Qt2/MvUPkpEbn7hhGfpSRs4ot8D3Vf5QEX4S/QtC1OsFWuciiYgHAT1Ybjt4xZic9DSkmA==} + /@swc/core-linux-x64-gnu/1.3.40: + resolution: {integrity: sha512-ZsfVlzXSXvNZBuK1fCrenoLSLVv0Zk7OdmkAG9cWN3bKkc/ynxO+6njXLEKWfv9bRfDBXhxifyHGOVOQlIFIAA==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -1215,8 +1247,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-musl/1.3.35: - resolution: {integrity: sha512-4XavNJ60GprjpTiESCu5daJUnmErixPAqDitJSMu4TV32LNIE8G00S9pDLXinDTW1rgcGtQdq1NLkNRmwwovtg==} + /@swc/core-linux-x64-musl/1.3.40: + resolution: {integrity: sha512-5GgMuadbd6fhHg/+7W25i+9OQTW4nTMGECias0BNPlcW8nnohzSphpj5jLI/Ub5bWzMwE2hua6e2uiZ17rTySg==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -1224,8 +1256,8 @@ packages: dev: true optional: true - /@swc/core-win32-arm64-msvc/1.3.35: - resolution: {integrity: sha512-dNGfKCUSX2M4qVyaS80Lyos0FkXyHRCvrdQ2Y4Hrg3FVokiuw3yY6fLohpUfQ5ws3n2A39dh7jGDeh34+l0sGA==} + /@swc/core-win32-arm64-msvc/1.3.40: + resolution: {integrity: sha512-TqiK28eaK3YOKSp8iESlrrbSzDGRQqM0zR4hvCgfHwL4L1BPh/M0aIMC/vyYh2gqpz2quyNqgi/DxoZ2+WxlUg==} engines: {node: '>=10'} cpu: [arm64] os: [win32] @@ -1233,8 +1265,8 @@ packages: dev: true optional: true - /@swc/core-win32-ia32-msvc/1.3.35: - resolution: {integrity: sha512-ChuPSrDR+JBf7S7dEKPicnG8A3bM0uWPsW2vG+V2wH4iNfNxKVemESHosmYVeEZXqMpomNMvLyeHep1rjRsc0Q==} + /@swc/core-win32-ia32-msvc/1.3.40: + resolution: {integrity: sha512-PqtCXFs5+ZbrfFe1VZAcCl8k9h47wE65mKDhDvZ9/SQhXxZX2+f5mUGXuH4G5rA0CyijsVpHnpA/5rqE7f2Sxw==} engines: {node: '>=10'} cpu: [ia32] os: [win32] @@ -1242,8 +1274,8 @@ packages: dev: true optional: true - /@swc/core-win32-x64-msvc/1.3.35: - resolution: {integrity: sha512-/RvphT4WfuGfIK84Ha0dovdPrKB1bW/mc+dtdmhv2E3EGkNc5FoueNwYmXWRimxnU7X0X7IkcRhyKB4G5DeAmg==} + /@swc/core-win32-x64-msvc/1.3.40: + resolution: {integrity: sha512-73DGsjsJYSzmoRbfomPj5jcQawtK2H0bCDi/1wgfl8NKVOuzrq+PpaTry3lzx+gvTHxUX6mUHV22i7C9ITL74Q==} engines: {node: '>=10'} cpu: [x64] os: [win32] @@ -1251,21 +1283,21 @@ packages: dev: true optional: true - /@swc/core/1.3.35: - resolution: {integrity: sha512-KmiBin0XSVzJhzX19zTiCqmLslZ40Cl7zqskJcTDeIrRhfgKdiAsxzYUanJgMJIRjYtl9Kcg1V/Ip2o2wL8v3w==} + /@swc/core/1.3.40: + resolution: {integrity: sha512-ZQJ+NID24PQkPIHnbO2B68YNQ6aMEyDz6dcsZucpRK4r7+aPqQ2yVLaqFcQU9VcGMyo4JJydmokzyTr1roWPIQ==} engines: {node: '>=10'} requiresBuild: true optionalDependencies: - '@swc/core-darwin-arm64': 1.3.35 - '@swc/core-darwin-x64': 1.3.35 - '@swc/core-linux-arm-gnueabihf': 1.3.35 - '@swc/core-linux-arm64-gnu': 1.3.35 - '@swc/core-linux-arm64-musl': 1.3.35 - '@swc/core-linux-x64-gnu': 1.3.35 - '@swc/core-linux-x64-musl': 1.3.35 - '@swc/core-win32-arm64-msvc': 1.3.35 - '@swc/core-win32-ia32-msvc': 1.3.35 - '@swc/core-win32-x64-msvc': 1.3.35 + '@swc/core-darwin-arm64': 1.3.40 + '@swc/core-darwin-x64': 1.3.40 + '@swc/core-linux-arm-gnueabihf': 1.3.40 + '@swc/core-linux-arm64-gnu': 1.3.40 + '@swc/core-linux-arm64-musl': 1.3.40 + '@swc/core-linux-x64-gnu': 1.3.40 + '@swc/core-linux-x64-musl': 1.3.40 + '@swc/core-win32-arm64-msvc': 1.3.40 + '@swc/core-win32-ia32-msvc': 1.3.40 + '@swc/core-win32-x64-msvc': 1.3.40 dev: true /@swc/helpers/0.4.14: @@ -1347,14 +1379,14 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 18.13.0 + '@types/node': 18.15.3 '@types/responselike': 1.0.0 dev: true /@types/graceful-fs/4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: - '@types/node': 18.13.0 + '@types/node': 18.15.3 dev: true /@types/http-cache-semantics/4.0.1: @@ -1377,11 +1409,11 @@ packages: '@types/istanbul-lib-report': 3.0.0 dev: true - /@types/jest/29.4.0: - resolution: {integrity: sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ==} + /@types/jest/29.4.1: + resolution: {integrity: sha512-zDQSWXG+ZkEvs2zFFMszePhx4euKz+Yt3Gg1P+RHjfJBinTTr6L2DEyovO4V/WrKXuF0Dgn56GWGZPDa6TW9eQ==} dependencies: - expect: 29.3.1 - pretty-format: 29.3.1 + expect: 29.5.0 + pretty-format: 29.5.0 dev: true /@types/json-schema/7.0.11: @@ -1391,11 +1423,11 @@ packages: /@types/keyv/3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.13.0 + '@types/node': 18.15.3 dev: true - /@types/node/18.13.0: - resolution: {integrity: sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==} + /@types/node/18.15.3: + resolution: {integrity: sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==} dev: true /@types/prettier/2.7.1: @@ -1405,7 +1437,7 @@ packages: /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 18.13.0 + '@types/node': 18.15.3 dev: true /@types/semver/7.3.13: @@ -1430,8 +1462,8 @@ packages: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/eslint-plugin/5.52.0_ztklytm4bn76xg7iayqqmkhuka: - resolution: {integrity: sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==} + /@typescript-eslint/eslint-plugin/5.55.0_3x3un3wo2noupza6oxjpuhskge: + resolution: {integrity: sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -1441,25 +1473,25 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.52.0_xkpid3yoisizbf5i4jpmwuknpy - '@typescript-eslint/scope-manager': 5.52.0 - '@typescript-eslint/type-utils': 5.52.0_xkpid3yoisizbf5i4jpmwuknpy - '@typescript-eslint/utils': 5.52.0_xkpid3yoisizbf5i4jpmwuknpy + '@eslint-community/regexpp': 4.4.0 + '@typescript-eslint/parser': 5.55.0_o7jyplx7gatjz5hr5kke5hclw4 + '@typescript-eslint/scope-manager': 5.55.0 + '@typescript-eslint/type-utils': 5.55.0_o7jyplx7gatjz5hr5kke5hclw4 + '@typescript-eslint/utils': 5.55.0_o7jyplx7gatjz5hr5kke5hclw4 debug: 4.3.4 - eslint: 8.34.0 + eslint: 8.36.0 grapheme-splitter: 1.0.4 ignore: 5.2.0 natural-compare-lite: 1.4.0 - regexpp: 3.2.0 semver: 7.3.8 - tsutils: 3.21.0_ujzcdj5eu57huy77ckcec3nqfu - typescript: 5.0.0-dev.20230219 + tsutils: 3.21.0_lhjsnkwfuzx4t5awgab43ri4gq + typescript: 5.1.0-dev.20230313 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.52.0_xkpid3yoisizbf5i4jpmwuknpy: - resolution: {integrity: sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==} + /@typescript-eslint/parser/5.55.0_o7jyplx7gatjz5hr5kke5hclw4: + resolution: {integrity: sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1468,26 +1500,26 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.52.0 - '@typescript-eslint/types': 5.52.0 - '@typescript-eslint/typescript-estree': 5.52.0_ujzcdj5eu57huy77ckcec3nqfu + '@typescript-eslint/scope-manager': 5.55.0 + '@typescript-eslint/types': 5.55.0 + '@typescript-eslint/typescript-estree': 5.55.0_lhjsnkwfuzx4t5awgab43ri4gq debug: 4.3.4 - eslint: 8.34.0 - typescript: 5.0.0-dev.20230219 + eslint: 8.36.0 + typescript: 5.1.0-dev.20230313 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/5.52.0: - resolution: {integrity: sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==} + /@typescript-eslint/scope-manager/5.55.0: + resolution: {integrity: sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.52.0 - '@typescript-eslint/visitor-keys': 5.52.0 + '@typescript-eslint/types': 5.55.0 + '@typescript-eslint/visitor-keys': 5.55.0 dev: true - /@typescript-eslint/type-utils/5.52.0_xkpid3yoisizbf5i4jpmwuknpy: - resolution: {integrity: sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==} + /@typescript-eslint/type-utils/5.55.0_o7jyplx7gatjz5hr5kke5hclw4: + resolution: {integrity: sha512-ObqxBgHIXj8rBNm0yh8oORFrICcJuZPZTqtAFh0oZQyr5DnAHZWfyw54RwpEEH+fD8suZaI0YxvWu5tYE/WswA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -1496,23 +1528,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.52.0_ujzcdj5eu57huy77ckcec3nqfu - '@typescript-eslint/utils': 5.52.0_xkpid3yoisizbf5i4jpmwuknpy + '@typescript-eslint/typescript-estree': 5.55.0_lhjsnkwfuzx4t5awgab43ri4gq + '@typescript-eslint/utils': 5.55.0_o7jyplx7gatjz5hr5kke5hclw4 debug: 4.3.4 - eslint: 8.34.0 - tsutils: 3.21.0_ujzcdj5eu57huy77ckcec3nqfu - typescript: 5.0.0-dev.20230219 + eslint: 8.36.0 + tsutils: 3.21.0_lhjsnkwfuzx4t5awgab43ri4gq + typescript: 5.1.0-dev.20230313 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types/5.52.0: - resolution: {integrity: sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==} + /@typescript-eslint/types/5.55.0: + resolution: {integrity: sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.52.0_ujzcdj5eu57huy77ckcec3nqfu: - resolution: {integrity: sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==} + /@typescript-eslint/typescript-estree/5.55.0_lhjsnkwfuzx4t5awgab43ri4gq: + resolution: {integrity: sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -1520,43 +1552,43 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.52.0 - '@typescript-eslint/visitor-keys': 5.52.0 + '@typescript-eslint/types': 5.55.0 + '@typescript-eslint/visitor-keys': 5.55.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.8 - tsutils: 3.21.0_ujzcdj5eu57huy77ckcec3nqfu - typescript: 5.0.0-dev.20230219 + tsutils: 3.21.0_lhjsnkwfuzx4t5awgab43ri4gq + typescript: 5.1.0-dev.20230313 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.52.0_xkpid3yoisizbf5i4jpmwuknpy: - resolution: {integrity: sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==} + /@typescript-eslint/utils/5.55.0_o7jyplx7gatjz5hr5kke5hclw4: + resolution: {integrity: sha512-FkW+i2pQKcpDC3AY6DU54yl8Lfl14FVGYDgBTyGKB75cCwV3KpkpTMFi9d9j2WAJ4271LR2HeC5SEWF/CZmmfw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: + '@eslint-community/eslint-utils': 4.2.0_eslint@8.36.0 '@types/json-schema': 7.0.11 '@types/semver': 7.3.13 - '@typescript-eslint/scope-manager': 5.52.0 - '@typescript-eslint/types': 5.52.0 - '@typescript-eslint/typescript-estree': 5.52.0_ujzcdj5eu57huy77ckcec3nqfu - eslint: 8.34.0 + '@typescript-eslint/scope-manager': 5.55.0 + '@typescript-eslint/types': 5.55.0 + '@typescript-eslint/typescript-estree': 5.55.0_lhjsnkwfuzx4t5awgab43ri4gq + eslint: 8.36.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.34.0 semver: 7.3.8 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys/5.52.0: - resolution: {integrity: sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==} + /@typescript-eslint/visitor-keys/5.55.0: + resolution: {integrity: sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.52.0 + '@typescript-eslint/types': 5.55.0 eslint-visitor-keys: 3.3.0 dev: true @@ -1734,17 +1766,17 @@ packages: - encoding dev: true - /babel-jest/29.4.3_@babel+core@7.20.2: - resolution: {integrity: sha512-o45Wyn32svZE+LnMVWv/Z4x0SwtLbh4FyGcYtR20kIWd+rdrDZ9Fzq8Ml3MYLD+mZvEdzCjZsCnYZ2jpJyQ+Nw==} + /babel-jest/29.5.0_@babel+core@7.20.2: + resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: '@babel/core': 7.20.2 - '@jest/transform': 29.4.3 + '@jest/transform': 29.5.0 '@types/babel__core': 7.1.20 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.4.3_@babel+core@7.20.2 + babel-preset-jest: 29.5.0_@babel+core@7.20.2 chalk: 4.1.2 graceful-fs: 4.2.10 slash: 3.0.0 @@ -1765,8 +1797,8 @@ packages: - supports-color dev: true - /babel-plugin-jest-hoist/29.4.3: - resolution: {integrity: sha512-mB6q2q3oahKphy5V7CpnNqZOCkxxZ9aokf1eh82Dy3jQmg4xvM1tGrh5y6BQUJh4a3Pj9+eLfwvAZ7VNKg7H8Q==} + /babel-plugin-jest-hoist/29.5.0: + resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/template': 7.18.10 @@ -1795,14 +1827,14 @@ packages: '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.2 dev: true - /babel-preset-jest/29.4.3_@babel+core@7.20.2: - resolution: {integrity: sha512-gWx6COtSuma6n9bw+8/F+2PCXrIgxV/D1TJFnp6OyBK2cxPWg0K9p/sriNYeifKjpUkMViWQ09DSWtzJQRETsw==} + /babel-preset-jest/29.5.0_@babel+core@7.20.2: + resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.20.2 - babel-plugin-jest-hoist: 29.4.3 + babel-plugin-jest-hoist: 29.5.0 babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.2 dev: true @@ -1857,7 +1889,7 @@ packages: dependencies: ansi-align: 3.0.1 camelcase: 7.0.0 - chalk: 5.1.2 + chalk: 5.2.0 cli-boxes: 3.0.0 string-width: 5.1.2 type-fest: 2.19.0 @@ -1929,16 +1961,16 @@ packages: engines: {node: '>=14.16'} dev: true - /cacheable-request/10.2.2: - resolution: {integrity: sha512-KxjQZM3UIo7/J6W4sLpwFvu1GB3Whv8NtZ8ZrUL284eiQjiXeeqWTdhixNrp/NLZ/JNuFBo6BD4ZaO8ZJ5BN8Q==} + /cacheable-request/10.2.8: + resolution: {integrity: sha512-IDVO5MJ4LItE6HKFQTqT2ocAQsisOoCTUDu1ddCmnhyiwFQjXNPp4081Xj23N4tO+AFEFNzGuNEf/c8Gwwt15A==} engines: {node: '>=14.16'} dependencies: '@types/http-cache-semantics': 4.0.1 get-stream: 6.0.1 - http-cache-semantics: 4.1.0 + http-cache-semantics: 4.1.1 keyv: 4.5.2 mimic-response: 4.0.0 - normalize-url: 7.2.0 + normalize-url: 8.0.0 responselike: 3.0.0 dev: true @@ -2008,8 +2040,8 @@ packages: supports-color: 7.2.0 dev: true - /chalk/5.1.2: - resolution: {integrity: sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==} + /chalk/5.2.0: + resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true @@ -2174,8 +2206,8 @@ packages: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true - /cosmiconfig/8.0.0: - resolution: {integrity: sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==} + /cosmiconfig/8.1.0: + resolution: {integrity: sha512-0tLZ9URlPGU7JsKq0DQOQ3FoRsYX8xDZ7xMiATQfaiGMz7EHowNkbU9u1coAOmnh9p/1ySpm0RB3JNWRXM5GCg==} engines: {node: '>=14'} dependencies: import-fresh: 3.3.0 @@ -2317,11 +2349,6 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /diff-sequences/29.3.1: - resolution: {integrity: sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - /diff-sequences/29.4.3: resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2361,6 +2388,10 @@ packages: resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} dev: true + /elfs/0.0.7: + resolution: {integrity: sha512-jjQOwSfN2ZvQOJDas3ee6qXzMpYRK2og6fDfl28n0E8MGgn0eJRkECoa6uQV60vQauaGo+3Cn+kDLNr/ycPgFg==} + dev: false + /emittery/0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} @@ -2449,38 +2480,38 @@ packages: /esbuild-plugin-swc/1.0.1: resolution: {integrity: sha512-K/basZARuDSHH7Krr7FdzwZF4WRLTcZa4c0R2FPuXCyYdh2nZMDdi6SYuuDv0MzKQY+jm0Afl4gltLsBzPesiQ==} dependencies: - '@swc/core': 1.3.35 + '@swc/core': 1.3.40 deepmerge: 4.2.2 dev: true - /esbuild/0.17.8: - resolution: {integrity: sha512-g24ybC3fWhZddZK6R3uD2iF/RIPnRpwJAqLov6ouX3hMbY4+tKolP0VMF3zuIYCaXun+yHwS5IPQ91N2BT191g==} + /esbuild/0.17.11: + resolution: {integrity: sha512-pAMImyokbWDtnA/ufPxjQg0fYo2DDuzAlqwnDvbXqHLphe+m80eF++perYKVm8LeTuj2zUuFXC+xgSVxyoHUdg==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.17.8 - '@esbuild/android-arm64': 0.17.8 - '@esbuild/android-x64': 0.17.8 - '@esbuild/darwin-arm64': 0.17.8 - '@esbuild/darwin-x64': 0.17.8 - '@esbuild/freebsd-arm64': 0.17.8 - '@esbuild/freebsd-x64': 0.17.8 - '@esbuild/linux-arm': 0.17.8 - '@esbuild/linux-arm64': 0.17.8 - '@esbuild/linux-ia32': 0.17.8 - '@esbuild/linux-loong64': 0.17.8 - '@esbuild/linux-mips64el': 0.17.8 - '@esbuild/linux-ppc64': 0.17.8 - '@esbuild/linux-riscv64': 0.17.8 - '@esbuild/linux-s390x': 0.17.8 - '@esbuild/linux-x64': 0.17.8 - '@esbuild/netbsd-x64': 0.17.8 - '@esbuild/openbsd-x64': 0.17.8 - '@esbuild/sunos-x64': 0.17.8 - '@esbuild/win32-arm64': 0.17.8 - '@esbuild/win32-ia32': 0.17.8 - '@esbuild/win32-x64': 0.17.8 + '@esbuild/android-arm': 0.17.11 + '@esbuild/android-arm64': 0.17.11 + '@esbuild/android-x64': 0.17.11 + '@esbuild/darwin-arm64': 0.17.11 + '@esbuild/darwin-x64': 0.17.11 + '@esbuild/freebsd-arm64': 0.17.11 + '@esbuild/freebsd-x64': 0.17.11 + '@esbuild/linux-arm': 0.17.11 + '@esbuild/linux-arm64': 0.17.11 + '@esbuild/linux-ia32': 0.17.11 + '@esbuild/linux-loong64': 0.17.11 + '@esbuild/linux-mips64el': 0.17.11 + '@esbuild/linux-ppc64': 0.17.11 + '@esbuild/linux-riscv64': 0.17.11 + '@esbuild/linux-s390x': 0.17.11 + '@esbuild/linux-x64': 0.17.11 + '@esbuild/netbsd-x64': 0.17.11 + '@esbuild/openbsd-x64': 0.17.11 + '@esbuild/sunos-x64': 0.17.11 + '@esbuild/win32-arm64': 0.17.11 + '@esbuild/win32-ia32': 0.17.11 + '@esbuild/win32-x64': 0.17.11 dev: true /escalade/3.1.1: @@ -2526,13 +2557,13 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier/8.6.0_eslint@8.34.0: - resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} + /eslint-config-prettier/8.7.0_eslint@8.36.0: + resolution: {integrity: sha512-HHVXLSlVUhMSmyW4ZzEuvjpwqamgmlfkutD53cYXLikh4pt/modINRcCIApJ84czDxM4GZInwUrromsDdTImTA==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.34.0 + eslint: 8.36.0 dev: true /eslint-scope/5.1.1: @@ -2551,32 +2582,20 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils/3.0.0_eslint@8.34.0: - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.34.0 - eslint-visitor-keys: 2.1.0 - dev: true - - /eslint-visitor-keys/2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: true - /eslint-visitor-keys/3.3.0: resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/8.34.0: - resolution: {integrity: sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==} + /eslint/8.36.0: + resolution: {integrity: sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint/eslintrc': 1.4.1 + '@eslint-community/eslint-utils': 4.2.0_eslint@8.36.0 + '@eslint-community/regexpp': 4.4.0 + '@eslint/eslintrc': 2.0.1 + '@eslint/js': 8.36.0 '@humanwhocodes/config-array': 0.11.8 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -2587,10 +2606,9 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.34.0 eslint-visitor-keys: 3.3.0 - espree: 9.4.1 - esquery: 1.4.0 + espree: 9.5.0 + esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 @@ -2611,7 +2629,6 @@ packages: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.1 - regexpp: 3.2.0 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 text-table: 0.2.0 @@ -2619,8 +2636,8 @@ packages: - supports-color dev: true - /espree/9.4.1: - resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} + /espree/9.5.0: + resolution: {integrity: sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: acorn: 8.8.1 @@ -2634,8 +2651,8 @@ packages: hasBin: true dev: true - /esquery/1.4.0: - resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} + /esquery/1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 @@ -2691,13 +2708,13 @@ packages: strip-final-newline: 2.0.0 dev: true - /execa/6.1.0: - resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + /execa/7.0.0: + resolution: {integrity: sha512-tQbH0pH/8LHTnwTrsKWideqi6rFB/QNUawEwrn+WHyz7PX1Tuz2u7wfTvbaNBdP5JD5LVWxNo8/A8CHNZ3bV6g==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 - human-signals: 3.0.1 + human-signals: 4.3.0 is-stream: 3.0.0 merge-stream: 2.0.0 npm-run-path: 5.1.0 @@ -2725,26 +2742,15 @@ packages: homedir-polyfill: 1.0.3 dev: true - /expect/29.3.1: - resolution: {integrity: sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/expect-utils': 29.3.1 - jest-get-type: 29.2.0 - jest-matcher-utils: 29.3.1 - jest-message-util: 29.3.1 - jest-util: 29.3.1 - dev: true - - /expect/29.4.3: - resolution: {integrity: sha512-uC05+Q7eXECFpgDrHdXA4k2rpMyStAYPItEDLyQDo5Ta7fVkJnNA/4zh/OIVkVVNZ1oOK1PipQoyNjuZ6sz6Dg==} + /expect/29.5.0: + resolution: {integrity: sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/expect-utils': 29.4.3 + '@jest/expect-utils': 29.5.0 jest-get-type: 29.4.3 - jest-matcher-utils: 29.4.3 - jest-message-util: 29.4.3 - jest-util: 29.4.3 + jest-matcher-utils: 29.5.0 + jest-message-util: 29.5.0 + jest-util: 29.5.0 dev: true /ext-list/2.2.2: @@ -3134,8 +3140,8 @@ packages: slash: 3.0.0 dev: true - /globby/13.1.2: - resolution: {integrity: sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==} + /globby/13.1.3: + resolution: {integrity: sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: dir-glob: 3.0.1 @@ -3162,14 +3168,14 @@ packages: responselike: 2.0.1 dev: true - /got/12.5.3: - resolution: {integrity: sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==} + /got/12.6.0: + resolution: {integrity: sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==} engines: {node: '>=14.16'} dependencies: '@sindresorhus/is': 5.3.0 '@szmarczak/http-timer': 5.0.1 cacheable-lookup: 7.0.0 - cacheable-request: 10.2.2 + cacheable-request: 10.2.8 decompress-response: 6.0.0 form-data-encoder: 2.1.3 get-stream: 6.0.1 @@ -3259,6 +3265,10 @@ packages: resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} dev: true + /http-cache-semantics/4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: true + /http-errors/2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -3312,9 +3322,9 @@ packages: engines: {node: '>=10.17.0'} dev: true - /human-signals/3.0.1: - resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==} - engines: {node: '>=12.20.0'} + /human-signals/4.3.0: + resolution: {integrity: sha512-zyzVyMjpGBX2+6cDVZeFPCdtOtdsxOeseRhB9tkQ6xXmGUNrcnBzdEKPy3VPNYz+4gy1oukVOXcrJCunSyc6QQ==} + engines: {node: '>=14.18.0'} dev: true /husky/8.0.3: @@ -3391,7 +3401,7 @@ packages: engines: {node: '>=12.0.0'} dependencies: ansi-escapes: 6.0.0 - chalk: 5.1.2 + chalk: 5.2.0 cli-cursor: 4.0.0 cli-width: 4.0.0 external-editor: 3.1.0 @@ -3725,43 +3735,44 @@ packages: iterate-iterator: 1.0.2 dev: true - /jest-changed-files/29.4.3: - resolution: {integrity: sha512-Vn5cLuWuwmi2GNNbokPOEcvrXGSGrqVnPEZV7rC6P7ck07Dyw9RFnvWglnupSh+hGys0ajGtw/bc2ZgweljQoQ==} + /jest-changed-files/29.5.0: + resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: execa: 5.1.1 p-limit: 3.1.0 dev: true - /jest-circus/29.4.3: - resolution: {integrity: sha512-Vw/bVvcexmdJ7MLmgdT3ZjkJ3LKu8IlpefYokxiqoZy6OCQ2VAm6Vk3t/qHiAGUXbdbJKJWnc8gH3ypTbB/OBw==} + /jest-circus/29.5.0: + resolution: {integrity: sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.4.3 - '@jest/expect': 29.4.3 - '@jest/test-result': 29.4.3 - '@jest/types': 29.4.3 - '@types/node': 18.13.0 + '@jest/environment': 29.5.0 + '@jest/expect': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.3 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 is-generator-fn: 2.1.0 - jest-each: 29.4.3 - jest-matcher-utils: 29.4.3 - jest-message-util: 29.4.3 - jest-runtime: 29.4.3 - jest-snapshot: 29.4.3 - jest-util: 29.4.3 + jest-each: 29.5.0 + jest-matcher-utils: 29.5.0 + jest-message-util: 29.5.0 + jest-runtime: 29.5.0 + jest-snapshot: 29.5.0 + jest-util: 29.5.0 p-limit: 3.1.0 - pretty-format: 29.4.3 + pretty-format: 29.5.0 + pure-rand: 6.0.0 slash: 3.0.0 stack-utils: 2.0.6 transitivePeerDependencies: - supports-color dev: true - /jest-cli/29.4.3_ucpl6toqp57nqodtp3vxxi6g5a: - resolution: {integrity: sha512-PiiAPuFNfWWolCE6t3ZrDXQc6OsAuM3/tVW0u27UWc1KE+n/HSn5dSE6B2juqN7WP+PP0jAcnKtGmI4u8GMYCg==} + /jest-cli/29.5.0_d2dllaz5dte7avnjm55wl7fmsu: + resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -3770,16 +3781,16 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.4.3_ts-node@10.9.1 - '@jest/test-result': 29.4.3 - '@jest/types': 29.4.3 + '@jest/core': 29.5.0_ts-node@10.9.1 + '@jest/test-result': 29.5.0 + '@jest/types': 29.5.0 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.10 import-local: 3.1.0 - jest-config: 29.4.3_ucpl6toqp57nqodtp3vxxi6g5a - jest-util: 29.4.3 - jest-validate: 29.4.3 + jest-config: 29.5.0_d2dllaz5dte7avnjm55wl7fmsu + jest-util: 29.5.0 + jest-validate: 29.5.0 prompts: 2.4.2 yargs: 17.6.2 transitivePeerDependencies: @@ -3788,8 +3799,8 @@ packages: - ts-node dev: true - /jest-config/29.4.3_ucpl6toqp57nqodtp3vxxi6g5a: - resolution: {integrity: sha512-eCIpqhGnIjdUCXGtLhz4gdDoxKSWXKjzNcc5r+0S1GKOp2fwOipx5mRcwa9GB/ArsxJ1jlj2lmlD9bZAsBxaWQ==} + /jest-config/29.5.0_d2dllaz5dte7avnjm55wl7fmsu: + resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@types/node': '*' @@ -3801,51 +3812,41 @@ packages: optional: true dependencies: '@babel/core': 7.20.2 - '@jest/test-sequencer': 29.4.3 - '@jest/types': 29.4.3 - '@types/node': 18.13.0 - babel-jest: 29.4.3_@babel+core@7.20.2 + '@jest/test-sequencer': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.3 + babel-jest: 29.5.0_@babel+core@7.20.2 chalk: 4.1.2 ci-info: 3.6.1 deepmerge: 4.2.2 glob: 7.2.3 graceful-fs: 4.2.10 - jest-circus: 29.4.3 - jest-environment-node: 29.4.3 + jest-circus: 29.5.0 + jest-environment-node: 29.5.0 jest-get-type: 29.4.3 jest-regex-util: 29.4.3 - jest-resolve: 29.4.3 - jest-runner: 29.4.3 - jest-util: 29.4.3 - jest-validate: 29.4.3 + jest-resolve: 29.5.0 + jest-runner: 29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 micromatch: 4.0.5 parse-json: 5.2.0 - pretty-format: 29.4.3 + pretty-format: 29.5.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1_igpqvytqs6nfxuvrz6echdviki + ts-node: 10.9.1_ba4srlkyyscguoqwtln5uyiwo4 transitivePeerDependencies: - supports-color dev: true - /jest-diff/29.3.1: - resolution: {integrity: sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 29.3.1 - jest-get-type: 29.4.3 - pretty-format: 29.4.3 - dev: true - - /jest-diff/29.4.3: - resolution: {integrity: sha512-YB+ocenx7FZ3T5O9lMVMeLYV4265socJKtkwgk/6YUz/VsEzYDkiMuMhWzZmxm3wDRQvayJu/PjkjjSkjoHsCA==} + /jest-diff/29.5.0: + resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 diff-sequences: 29.4.3 jest-get-type: 29.4.3 - pretty-format: 29.4.3 + pretty-format: 29.5.0 dev: true /jest-docblock/29.4.3: @@ -3855,32 +3856,27 @@ packages: detect-newline: 3.1.0 dev: true - /jest-each/29.4.3: - resolution: {integrity: sha512-1ElHNAnKcbJb/b+L+7j0/w7bDvljw4gTv1wL9fYOczeJrbTbkMGQ5iQPFJ3eFQH19VPTx1IyfePdqSpePKss7Q==} + /jest-each/29.5.0: + resolution: {integrity: sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.4.3 + '@jest/types': 29.5.0 chalk: 4.1.2 jest-get-type: 29.4.3 - jest-util: 29.4.3 - pretty-format: 29.4.3 + jest-util: 29.5.0 + pretty-format: 29.5.0 dev: true - /jest-environment-node/29.4.3: - resolution: {integrity: sha512-gAiEnSKF104fsGDXNkwk49jD/0N0Bqu2K9+aMQXA6avzsA9H3Fiv1PW2D+gzbOSR705bWd2wJZRFEFpV0tXISg==} + /jest-environment-node/29.5.0: + resolution: {integrity: sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.4.3 - '@jest/fake-timers': 29.4.3 - '@jest/types': 29.4.3 - '@types/node': 18.13.0 - jest-mock: 29.4.3 - jest-util: 29.4.3 - dev: true - - /jest-get-type/29.2.0: - resolution: {integrity: sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/environment': 29.5.0 + '@jest/fake-timers': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.3 + jest-mock: 29.5.0 + jest-util: 29.5.0 dev: true /jest-get-type/29.4.3: @@ -3888,93 +3884,68 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-haste-map/29.4.3: - resolution: {integrity: sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==} + /jest-haste-map/29.5.0: + resolution: {integrity: sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.4.3 + '@jest/types': 29.5.0 '@types/graceful-fs': 4.1.5 - '@types/node': 18.13.0 + '@types/node': 18.15.3 anymatch: 3.1.2 fb-watchman: 2.0.2 graceful-fs: 4.2.10 jest-regex-util: 29.4.3 - jest-util: 29.4.3 - jest-worker: 29.4.3 + jest-util: 29.5.0 + jest-worker: 29.5.0 micromatch: 4.0.5 walker: 1.0.8 optionalDependencies: fsevents: 2.3.2 dev: true - /jest-leak-detector/29.4.3: - resolution: {integrity: sha512-9yw4VC1v2NspMMeV3daQ1yXPNxMgCzwq9BocCwYrRgXe4uaEJPAN0ZK37nFBhcy3cUwEVstFecFLaTHpF7NiGA==} + /jest-leak-detector/29.5.0: + resolution: {integrity: sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.4.3 - pretty-format: 29.4.3 + pretty-format: 29.5.0 dev: true - /jest-matcher-utils/29.3.1: - resolution: {integrity: sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==} + /jest-matcher-utils/29.5.0: + resolution: {integrity: sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 - jest-diff: 29.3.1 - jest-get-type: 29.2.0 - pretty-format: 29.3.1 - dev: true - - /jest-matcher-utils/29.4.3: - resolution: {integrity: sha512-TTciiXEONycZ03h6R6pYiZlSkvYgT0l8aa49z/DLSGYjex4orMUcafuLXYyyEDWB1RKglq00jzwY00Ei7yFNVg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 29.4.3 + jest-diff: 29.5.0 jest-get-type: 29.4.3 - pretty-format: 29.4.3 - dev: true - - /jest-message-util/29.3.1: - resolution: {integrity: sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/code-frame': 7.18.6 - '@jest/types': 29.4.3 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.10 - micromatch: 4.0.5 - pretty-format: 29.3.1 - slash: 3.0.0 - stack-utils: 2.0.6 + pretty-format: 29.5.0 dev: true - /jest-message-util/29.4.3: - resolution: {integrity: sha512-1Y8Zd4ZCN7o/QnWdMmT76If8LuDv23Z1DRovBj/vcSFNlGCJGoO8D1nJDw1AdyAGUk0myDLFGN5RbNeJyCRGCw==} + /jest-message-util/29.5.0: + resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/code-frame': 7.18.6 - '@jest/types': 29.4.3 + '@jest/types': 29.5.0 '@types/stack-utils': 2.0.1 chalk: 4.1.2 graceful-fs: 4.2.10 micromatch: 4.0.5 - pretty-format: 29.4.3 + pretty-format: 29.5.0 slash: 3.0.0 stack-utils: 2.0.6 dev: true - /jest-mock/29.4.3: - resolution: {integrity: sha512-LjFgMg+xed9BdkPMyIJh+r3KeHt1klXPJYBULXVVAkbTaaKjPX1o1uVCAZADMEp/kOxGTwy/Ot8XbvgItOrHEg==} + /jest-mock/29.5.0: + resolution: {integrity: sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.4.3 - '@types/node': 18.13.0 - jest-util: 29.4.3 + '@jest/types': 29.5.0 + '@types/node': 18.15.3 + jest-util: 29.5.0 dev: true - /jest-pnp-resolver/1.2.3_jest-resolve@29.4.3: + /jest-pnp-resolver/1.2.3_jest-resolve@29.5.0: resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} peerDependencies: @@ -3983,7 +3954,7 @@ packages: jest-resolve: optional: true dependencies: - jest-resolve: 29.4.3 + jest-resolve: 29.5.0 dev: true /jest-regex-util/29.4.3: @@ -3991,92 +3962,92 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-resolve-dependencies/29.4.3: - resolution: {integrity: sha512-uvKMZAQ3nmXLH7O8WAOhS5l0iWyT3WmnJBdmIHiV5tBbdaDZ1wqtNX04FONGoaFvSOSHBJxnwAVnSn1WHdGVaw==} + /jest-resolve-dependencies/29.5.0: + resolution: {integrity: sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-regex-util: 29.4.3 - jest-snapshot: 29.4.3 + jest-snapshot: 29.5.0 transitivePeerDependencies: - supports-color dev: true - /jest-resolve/29.4.3: - resolution: {integrity: sha512-GPokE1tzguRyT7dkxBim4wSx6E45S3bOQ7ZdKEG+Qj0Oac9+6AwJPCk0TZh5Vu0xzeX4afpb+eDmgbmZFFwpOw==} + /jest-resolve/29.5.0: + resolution: {integrity: sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 graceful-fs: 4.2.10 - jest-haste-map: 29.4.3 - jest-pnp-resolver: 1.2.3_jest-resolve@29.4.3 - jest-util: 29.4.3 - jest-validate: 29.4.3 + jest-haste-map: 29.5.0 + jest-pnp-resolver: 1.2.3_jest-resolve@29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 resolve: 1.22.1 resolve.exports: 2.0.0 slash: 3.0.0 dev: true - /jest-runner/29.4.3: - resolution: {integrity: sha512-GWPTEiGmtHZv1KKeWlTX9SIFuK19uLXlRQU43ceOQ2hIfA5yPEJC7AMkvFKpdCHx6pNEdOD+2+8zbniEi3v3gA==} + /jest-runner/29.5.0: + resolution: {integrity: sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.4.3 - '@jest/environment': 29.4.3 - '@jest/test-result': 29.4.3 - '@jest/transform': 29.4.3 - '@jest/types': 29.4.3 - '@types/node': 18.13.0 + '@jest/console': 29.5.0 + '@jest/environment': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.3 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.10 jest-docblock: 29.4.3 - jest-environment-node: 29.4.3 - jest-haste-map: 29.4.3 - jest-leak-detector: 29.4.3 - jest-message-util: 29.4.3 - jest-resolve: 29.4.3 - jest-runtime: 29.4.3 - jest-util: 29.4.3 - jest-watcher: 29.4.3 - jest-worker: 29.4.3 + jest-environment-node: 29.5.0 + jest-haste-map: 29.5.0 + jest-leak-detector: 29.5.0 + jest-message-util: 29.5.0 + jest-resolve: 29.5.0 + jest-runtime: 29.5.0 + jest-util: 29.5.0 + jest-watcher: 29.5.0 + jest-worker: 29.5.0 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color dev: true - /jest-runtime/29.4.3: - resolution: {integrity: sha512-F5bHvxSH+LvLV24vVB3L8K467dt3y3dio6V3W89dUz9nzvTpqd/HcT9zfYKL2aZPvD63vQFgLvaUX/UpUhrP6Q==} + /jest-runtime/29.5.0: + resolution: {integrity: sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.4.3 - '@jest/fake-timers': 29.4.3 - '@jest/globals': 29.4.3 + '@jest/environment': 29.5.0 + '@jest/fake-timers': 29.5.0 + '@jest/globals': 29.5.0 '@jest/source-map': 29.4.3 - '@jest/test-result': 29.4.3 - '@jest/transform': 29.4.3 - '@jest/types': 29.4.3 - '@types/node': 18.13.0 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.3 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 glob: 7.2.3 graceful-fs: 4.2.10 - jest-haste-map: 29.4.3 - jest-message-util: 29.4.3 - jest-mock: 29.4.3 + jest-haste-map: 29.5.0 + jest-message-util: 29.5.0 + jest-mock: 29.5.0 jest-regex-util: 29.4.3 - jest-resolve: 29.4.3 - jest-snapshot: 29.4.3 - jest-util: 29.4.3 + jest-resolve: 29.5.0 + jest-snapshot: 29.5.0 + jest-util: 29.5.0 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color dev: true - /jest-snapshot/29.4.3: - resolution: {integrity: sha512-NGlsqL0jLPDW91dz304QTM/SNO99lpcSYYAjNiX0Ou+sSGgkanKBcSjCfp/pqmiiO1nQaOyLp6XQddAzRcx3Xw==} + /jest-snapshot/29.5.0: + resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/core': 7.20.2 @@ -4085,23 +4056,22 @@ packages: '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.2 '@babel/traverse': 7.20.1 '@babel/types': 7.20.2 - '@jest/expect-utils': 29.4.3 - '@jest/transform': 29.4.3 - '@jest/types': 29.4.3 + '@jest/expect-utils': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 '@types/babel__traverse': 7.18.2 '@types/prettier': 2.7.1 babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.2 chalk: 4.1.2 - expect: 29.4.3 + expect: 29.5.0 graceful-fs: 4.2.10 - jest-diff: 29.4.3 + jest-diff: 29.5.0 jest-get-type: 29.4.3 - jest-haste-map: 29.4.3 - jest-matcher-utils: 29.4.3 - jest-message-util: 29.4.3 - jest-util: 29.4.3 + jest-matcher-utils: 29.5.0 + jest-message-util: 29.5.0 + jest-util: 29.5.0 natural-compare: 1.4.0 - pretty-format: 29.4.3 + pretty-format: 29.5.0 semver: 7.3.8 transitivePeerDependencies: - supports-color @@ -4112,63 +4082,63 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.4.3 - '@types/node': 18.13.0 + '@types/node': 18.15.3 chalk: 4.1.2 ci-info: 3.6.1 graceful-fs: 4.2.10 picomatch: 2.3.1 dev: true - /jest-util/29.4.3: - resolution: {integrity: sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==} + /jest-util/29.5.0: + resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.4.3 - '@types/node': 18.13.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.3 chalk: 4.1.2 ci-info: 3.6.1 graceful-fs: 4.2.10 picomatch: 2.3.1 dev: true - /jest-validate/29.4.3: - resolution: {integrity: sha512-J3u5v7aPQoXPzaar6GndAVhdQcZr/3osWSgTeKg5v574I9ybX/dTyH0AJFb5XgXIB7faVhf+rS7t4p3lL9qFaw==} + /jest-validate/29.5.0: + resolution: {integrity: sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.4.3 + '@jest/types': 29.5.0 camelcase: 6.3.0 chalk: 4.1.2 jest-get-type: 29.4.3 leven: 3.1.0 - pretty-format: 29.4.3 + pretty-format: 29.5.0 dev: true - /jest-watcher/29.4.3: - resolution: {integrity: sha512-zwlXH3DN3iksoIZNk73etl1HzKyi5FuQdYLnkQKm5BW4n8HpoG59xSwpVdFrnh60iRRaRBGw0gcymIxjJENPcA==} + /jest-watcher/29.5.0: + resolution: {integrity: sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 29.4.3 - '@jest/types': 29.4.3 - '@types/node': 18.13.0 + '@jest/test-result': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.15.3 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 - jest-util: 29.4.3 + jest-util: 29.5.0 string-length: 4.0.2 dev: true - /jest-worker/29.4.3: - resolution: {integrity: sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==} + /jest-worker/29.5.0: + resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 18.13.0 - jest-util: 29.4.3 + '@types/node': 18.15.3 + jest-util: 29.5.0 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest/29.4.3_ucpl6toqp57nqodtp3vxxi6g5a: - resolution: {integrity: sha512-XvK65feuEFGZT8OO0fB/QAQS+LGHvQpaadkH5p47/j3Ocqq3xf2pK9R+G0GzgfuhXVxEv76qCOOcMb5efLk6PA==} + /jest/29.5.0_d2dllaz5dte7avnjm55wl7fmsu: + resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -4177,10 +4147,10 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.4.3_ts-node@10.9.1 - '@jest/types': 29.4.3 + '@jest/core': 29.5.0_ts-node@10.9.1 + '@jest/types': 29.5.0 import-local: 3.1.0 - jest-cli: 29.4.3_ucpl6toqp57nqodtp3vxxi6g5a + jest-cli: 29.5.0_d2dllaz5dte7avnjm55wl7fmsu transitivePeerDependencies: - '@types/node' - supports-color @@ -4326,7 +4296,7 @@ packages: resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} engines: {node: '>=12'} dependencies: - chalk: 5.1.2 + chalk: 5.2.0 is-unicode-supported: 1.3.0 dev: true @@ -4548,9 +4518,9 @@ packages: engines: {node: '>=10'} dev: true - /normalize-url/7.2.0: - resolution: {integrity: sha512-uhXOdZry0L6M2UIo9BTt7FdpBDiAGN/7oItedQwPKh8jh31ZlvC8U9Xl/EJ3aijDHaywXTW3QbZ6LuCocur1YA==} - engines: {node: '>=12.20'} + /normalize-url/8.0.0: + resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} + engines: {node: '>=14.16'} dev: true /npm-dts/1.3.12: @@ -4661,8 +4631,8 @@ packages: mimic-fn: 4.0.0 dev: true - /open/8.4.0: - resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==} + /open/8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} dependencies: define-lazy-prop: 2.0.0 @@ -4699,7 +4669,7 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: bl: 5.1.0 - chalk: 5.1.2 + chalk: 5.2.0 cli-cursor: 4.0.0 cli-spinners: 2.7.0 is-interactive: 2.0.0 @@ -4716,8 +4686,8 @@ packages: arch: 2.2.0 dev: true - /os-name/5.0.1: - resolution: {integrity: sha512-0EQpaHUHq7olp2/YFUr+0vZi9tMpDTblHGz+Ch5RntKxiRXOAY0JOz1UlxhSjMSksHvkm13eD6elJj3M8Ht/kw==} + /os-name/5.1.0: + resolution: {integrity: sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: macos-release: 3.1.0 @@ -4807,7 +4777,7 @@ packages: resolution: {integrity: sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==} engines: {node: '>=14.16'} dependencies: - got: 12.5.3 + got: 12.6.0 registry-auth-token: 5.0.1 registry-url: 6.0.1 semver: 7.3.8 @@ -4934,17 +4904,8 @@ packages: hasBin: true dev: true - /pretty-format/29.3.1: - resolution: {integrity: sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.0.0 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - - /pretty-format/29.4.3: - resolution: {integrity: sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA==} + /pretty-format/29.5.0: + resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/schemas': 29.4.3 @@ -5027,6 +4988,10 @@ packages: escape-goat: 4.0.0 dev: true + /pure-rand/6.0.0: + resolution: {integrity: sha512-rLSBxJjP+4DQOgcJAx6RZHT2he2pkhQdSnofG5VWyVl6GRq/K02ISOuOLcsMOrtKDIJb8JN2zm3FFzWNbezdPw==} + dev: true + /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true @@ -5101,11 +5066,6 @@ packages: functions-have-names: 1.2.3 dev: true - /regexpp/3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - dev: true - /registry-auth-token/5.0.1: resolution: {integrity: sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA==} engines: {node: '>=14'} @@ -5120,29 +5080,29 @@ packages: rc: 1.2.8 dev: true - /release-it/15.6.0: - resolution: {integrity: sha512-NXewgzO8QV1LOFjn2K7/dgE1Y1cG+2JiLOU/x9X/Lq9UdFn2hTH1r9SSrufCxG+y/Rp+oN8liYTsNptKrj92kg==} + /release-it/15.8.0: + resolution: {integrity: sha512-eJwYY/vXefcnWn7OHlZRcQJYPSJw/fdO+29C/Re5MZE8FZReCHu+EYq3yB0Bm39/3cTVz/5I/2Fk5rtAsVFU1g==} engines: {node: '>=14.9'} hasBin: true dependencies: '@iarna/toml': 2.2.5 - '@octokit/rest': 19.0.5 + '@octokit/rest': 19.0.7 async-retry: 1.3.3 - chalk: 5.1.2 - cosmiconfig: 8.0.0 - execa: 6.1.0 + chalk: 5.2.0 + cosmiconfig: 8.1.0 + execa: 7.0.0 git-url-parse: 13.1.0 - globby: 13.1.2 - got: 12.5.3 + globby: 13.1.3 + got: 12.6.0 inquirer: 9.1.4 is-ci: 3.0.1 lodash: 4.17.21 mime-types: 2.1.35 new-github-release-url: 2.0.0 node-fetch: 3.3.0 - open: 8.4.0 + open: 8.4.2 ora: 6.1.2 - os-name: 5.0.1 + os-name: 5.1.0 promise.allsettled: 1.0.6 proxy-agent: 5.0.0 semver: 7.3.8 @@ -5681,7 +5641,7 @@ packages: resolution: {integrity: sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==} dev: true - /ts-jest/29.0.5_evw3tzrdq7gev6sd56epgi5xke: + /ts-jest/29.0.5_qqi5a5dl4dto2lhpz6h6vqbhoi: resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -5703,19 +5663,19 @@ packages: optional: true dependencies: bs-logger: 0.2.6 - esbuild: 0.17.8 + esbuild: 0.17.11 fast-json-stable-stringify: 2.1.0 - jest: 29.4.3_ucpl6toqp57nqodtp3vxxi6g5a + jest: 29.5.0_d2dllaz5dte7avnjm55wl7fmsu jest-util: 29.3.1 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.3.8 - typescript: 5.0.0-dev.20230219 + typescript: 5.1.0-dev.20230313 yargs-parser: 21.1.1 dev: true - /ts-node/10.9.1_igpqvytqs6nfxuvrz6echdviki: + /ts-node/10.9.1_ba4srlkyyscguoqwtln5uyiwo4: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -5730,19 +5690,19 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@swc/core': 1.3.35 + '@swc/core': 1.3.40 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 18.13.0 + '@types/node': 18.15.3 acorn: 8.8.1 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.0.0-dev.20230219 + typescript: 5.1.0-dev.20230313 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true @@ -5755,14 +5715,14 @@ packages: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} dev: true - /tsutils/3.21.0_ujzcdj5eu57huy77ckcec3nqfu: + /tsutils/3.21.0_lhjsnkwfuzx4t5awgab43ri4gq: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 5.0.0-dev.20230219 + typescript: 5.1.0-dev.20230313 dev: true /type-check/0.3.2: @@ -5815,12 +5775,17 @@ packages: is-typedarray: 1.0.0 dev: true - /typescript/5.0.0-dev.20230219: - resolution: {integrity: sha512-CjlwGu0BGvavGAPs7/2sng1K0EYubaZc3irzGboNBs83OI2+ij4QixjS8+nXcoR4H3uumDnyd7Vo/LoIgdSa7Q==} - engines: {node: '>=4.2.0'} + /typescript/5.1.0-dev.20230313: + resolution: {integrity: sha512-vveGdy/uNUyKJ/JbXsJTSP8Z8gfCRsiXdHBMbvJ2XzuzHsDQC3mR+ZPvIGrXoTWMn5XNbyJ8ufYuqGiCGTi6tg==} + engines: {node: '>=12.20'} hasBin: true dev: true + /ueve/1.2.2: + resolution: {integrity: sha512-wezkjPyr90gZjOCaBQySuqN9YqIL3SlUgrS6z6sRswcgQTq1RZwqJQJXWeVZrZuwY+3t2oOHA/pk8p26XCMPRQ==} + engines: {node: '>=16.0.0'} + dev: false + /uglify-js/3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} engines: {node: '>=0.8.0'} @@ -5875,7 +5840,7 @@ packages: engines: {node: '>=14.16'} dependencies: boxen: 7.0.0 - chalk: 5.1.2 + chalk: 5.2.0 configstore: 6.0.0 has-yarn: 3.0.0 import-lazy: 4.0.0 diff --git a/src/constants.ts b/src/constants.ts index 04dc9db..803689f 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -36,6 +36,7 @@ export const OFFSET: Offset = { min: 0, max: 0, median: 0, + cycles: 0, }; export const OFFSETS: Offsets = { diff --git a/src/events.ts b/src/events.ts new file mode 100644 index 0000000..a6e07af --- /dev/null +++ b/src/events.ts @@ -0,0 +1,24 @@ +import { eve } from "ueve/async"; +import { Offset, Offsets } from "./types"; + +export type Name = [symbol, string]; + +// Suite +export const $suiteStart = eve<{ suite: Name; benchmarks: string[] }>(); + +export const $suiteOffsets = eve<{ + suite: Name; + offsets: Offsets; +}>(); + +export const $suiteEnd = eve<{ suite: Name }>(); + +// Benchmark +export const $benchmarkStart = eve<{ suite: Name; benchmark: Name }>(); + +export const $benchmarkEnd = eve<{ + suite: Name; + benchmark: Name; + cpu: Offset; + ram: Offset; +}>(); diff --git a/src/index.ts b/src/index.ts index 4a99ae4..00a8a05 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1,3 @@ export * from "./types"; export * from "./preset"; +export * from "./events"; diff --git a/src/modes/index.ts b/src/modes/index.ts index 279da9d..f064a1c 100644 --- a/src/modes/index.ts +++ b/src/modes/index.ts @@ -1 +1 @@ -export * from "./modeMarkdown"; +export * from "./terminal"; diff --git a/src/modes/modeMarkdown.ts b/src/modes/modeMarkdown.ts deleted file mode 100644 index cbc1965..0000000 --- a/src/modes/modeMarkdown.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { writeFile } from "fs/promises"; -import { Fn, Results } from "../types"; - -export async function modeMarkdown( - suite: Fn<[], AsyncGenerator>, - path: string, -) { - const results: Results[] = []; - - let longestName = 0; - let mostKbs = 0; - - console.log("Benchmark started"); - console.log(); - - for await (const result of suite()) { - console.log(`-${result.name}`); - - if (result.name.length > longestName) { - longestName = result.name.length; - } - - if (result.ram.median > mostKbs) { - mostKbs = result.ram.median; - } - - results.push(result); - } - - console.log(); - console.log("Benchmark ended"); - console.log(); - - const sorted = results.sort( - ({ cpu: { median: a } }, { cpu: { median: b } }) => a - b, - ); - - let markdown = ""; - - markdown += `| name | op/s | kbs |\n`; - markdown += `|:---|:---|:---|\n`; - - for (let i = 0; i < results.length; ++i) { - const result = sorted[i]; - - const ops = - result.cpu.median === 0 - ? 1_000_000_000 - : Math.round(1_000_000_000 / result.cpu.median); - - markdown += `| ${result.name} | ${ops - .toLocaleString("en") - .replaceAll(",", " ")} | ${result.ram.median - .toLocaleString("en") - .replaceAll(",", " ")} |\n`; - } - - await writeFile(path, markdown); - - console.log(`Results saved to ${path}`); -} diff --git a/src/modes/terminal.ts b/src/modes/terminal.ts new file mode 100644 index 0000000..bae40ec --- /dev/null +++ b/src/modes/terminal.ts @@ -0,0 +1,100 @@ +import { sub } from "ueve/async"; +import { Either, Noop } from "elfs"; +import { red, green, bold, gray, blue, cyan } from "chalk"; +import { + $suiteStart, + $suiteEnd, + $benchmarkEnd, + $benchmarkStart, +} from "../events"; +import { Offset } from "../types"; +import { newLine, writeLine } from "../utils"; + +let suiteStart: Either<[null, Noop]> = null; +let suiteEnd: Either<[null, Noop]> = null; +let benchmarkStart: Either<[null, Noop]> = null; +let benchmarkEnd: Either<[null, Noop]> = null; + +export async function useTerminal() { + let results: { name: string; cpu: Offset; ram: Offset }[] = []; + let longestBenchmarkName = 0; + + suiteStart ??= sub($suiteStart, async ({ suite, benchmarks }) => { + results = []; + longestBenchmarkName = benchmarks.sort((a, b) => b.length - a.length)[0] + .length; + + writeLine(bold.underline(`${suite[1]}:`)); + newLine(); + }); + + suiteEnd ??= sub($suiteEnd, async () => { + newLine(); + writeLine( + `=> Slowest is ${red.bold.underline( + results.sort((a, b) => b.cpu.median - a.cpu.median)[0].name.trim(), + )}`, + ); + newLine(); + writeLine( + `=> Fastest is ${green.bold.underline( + results.sort((a, b) => a.cpu.median - b.cpu.median)[0].name.trim(), + )}`, + ); + newLine(); + newLine(); + }); + + benchmarkStart ??= sub($benchmarkStart, async ({ benchmark }) => { + const name = benchmark[1]; + + newLine(); + writeLine(bold(name)); + }); + + benchmarkEnd ??= sub($benchmarkEnd, async ({ benchmark, cpu, ram }) => { + const name = benchmark[1].padEnd(longestBenchmarkName); + + const isCpuZero = cpu.median === 0; + const ops = ( + isCpuZero ? 1_000_000_000 : (1_000_000_000 / cpu.median) | 0 + ).toLocaleString(); + const cpuMin = (isCpuZero ? 0 : cpu.min / cpu.median) + .toPrecision(1) + .toLocaleString(); + const cpuMax = (isCpuZero ? 0 : cpu.median / cpu.max) + .toPrecision(1) + .toLocaleString(); + const cpuCycles = cpu.cycles.toLocaleString(); + + const isRamZero = ram.median === 0; + const mb = (ram.median | 0).toLocaleString(); + const ramMin = (isRamZero ? 0 : ram.min / ram.median) + .toPrecision(1) + .toLocaleString(); + const ramMax = (isRamZero ? 0 : ram.median / ram.max) + .toPrecision(1) + .toLocaleString(); + const ramCycles = ram.cycles.toLocaleString(); + + results.push({ + name, + cpu, + ram, + }); + + const cpuSecondaryInfo = gray( + `[-${cpuMin}, +${cpuMax}]% (${cpuCycles} cycles)`, + ); + const ramSecondaryInfo = gray( + `[-${ramMin}, +${ramMax}]% (${ramCycles} cycles)`, + ); + + writeLine(`${bold(name)} ${blue(ops)} op/s ${cpuSecondaryInfo}`); + newLine(); + writeLine( + `${"".padEnd(longestBenchmarkName)} ${cyan(mb)} MB ${ramSecondaryInfo}`, + ); + newLine(); + }); +} diff --git a/src/preset.ts b/src/preset.ts index b34b5c9..5e9b726 100644 --- a/src/preset.ts +++ b/src/preset.ts @@ -4,32 +4,55 @@ import { getOffsets } from "./offset"; import { getOptions } from "./utils"; import { DeepPartial, Options, Benchmarks } from "./types"; import { stats } from "./stats"; +import { + $benchmarkEnd, + $benchmarkStart, + $suiteEnd, + $suiteOffsets, + $suiteStart, + Name, +} from "./events"; +import { pub } from "ueve/async"; export function preset(partialOptions?: DeepPartial) { const options = getOptions(partialOptions); const stores = createStores(options); return function createSuite<$Benchmarks extends Benchmarks>( + suiteName: string, benchmarks: $Benchmarks, ) { - return async function* runSuite() { + const suite = [Symbol(), suiteName] as Name; + + return async function runSuite() { + await pub($suiteStart, { suite, benchmarks: Object.keys(benchmarks) }); + GLOBAL.stores = stores; GLOBAL.options = options; const offsets = await getOffsets(); - for (const name in benchmarks) { + await pub($suiteOffsets, { suite, offsets }); + + for (const benchmarkName in benchmarks) { + const benchmark = [Symbol(), benchmarkName] as Name; + + await pub($benchmarkStart, { suite, benchmark }); + // We GC here so memory from one benchmark doesn't leak to the next one GLOBAL.options.gc.allow && global.gc?.(); - const benchmark = benchmarks[name]; + const fn = benchmarks[benchmarkName]; - yield { - name, - cpu: await stats(benchmark, "cpu", offsets), - ram: await stats(benchmark, "ram", offsets), - }; + await pub($benchmarkEnd, { + suite, + benchmark, + cpu: await stats(fn, "cpu", offsets), + ram: await stats(fn, "ram", offsets), + }); } + + await pub($suiteEnd, { suite }); }; }; } diff --git a/src/stats.ts b/src/stats.ts index 97286d8..21bd24f 100644 --- a/src/stats.ts +++ b/src/stats.ts @@ -28,7 +28,7 @@ export async function stats( // NOTE: if I'm right it stops collecting stats once the function is hot // but instead we want to reset the index and start collecting from that point - // since now we're basing out stats on the noise generated before it's hot + // since now we're basing our stats on the noise generated before it's hot if (max - (max / 100) * rangePercent <= min) { break; } @@ -52,5 +52,6 @@ export async function stats( median: positive(median - offset.median), min: positive(min - offset.min), max: positive(max - offset.max), + cycles: main.index * chunkSize, }; } diff --git a/src/types.ts b/src/types.ts index fcbb716..eae61ce 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,5 +1,7 @@ +import { Either, Fn } from "elfs"; + export type Obj< - $Input extends string | number | symbol = string, + $Input extends Either<[string, number, symbol]> = string, $Output = unknown, > = Record<$Input, $Output>; @@ -29,12 +31,6 @@ export type DeepPartial<$Object extends Obj> = Partial<{ : $Object[$Key]; }>; -export type Fn<$Input extends unknown[], $Output> = ( - ...props: $Input -) => $Output; - -export type Either<$Options extends unknown[]> = $Options[number]; - export type Benchmark = Fn<[], Either<[void, Promise]>>; export type Benchmarks = Obj; @@ -72,6 +68,7 @@ export type Offset = { min: number; max: number; median: number; + cycles: number; }; export type Offsets = { @@ -90,3 +87,5 @@ export type Results = { cpu: Offset; ram: Offset; }; + +export type Suite = Fn<[], AsyncGenerator>; diff --git a/src/utils/console.ts b/src/utils/console.ts new file mode 100644 index 0000000..9c1d6cb --- /dev/null +++ b/src/utils/console.ts @@ -0,0 +1,7 @@ +export const writeLine = (value: string) => { + process.stdout.clearLine(0); + process.stdout.cursorTo(0); + process.stdout.write(value); +}; + +export const newLine = () => console.log(); diff --git a/src/utils/index.ts b/src/utils/index.ts index 14bf1b5..ba75bf3 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,5 +1,5 @@ export * from "./getMinMax"; export * from "./getMedian"; export * from "./positive"; -export * from "./removePercent"; export * from "./getOptions"; +export * from "./console"; diff --git a/tsconfig.base.json b/tsconfig.base.json index 955acda..bced960 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -2,7 +2,7 @@ "compilerOptions": { "strict": true, "target": "ESNext", - "moduleResolution": "node", + "moduleResolution": "nodenext", "esModuleInterop": true, "declaration": true, "resolveJsonModule": true,