chore(bench): migrate to vitest (#2637)

This commit is contained in:
LongYinan 2025-05-16 22:27:23 +08:00 committed by GitHub
parent 8e481c1eba
commit 46bd338093
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
22 changed files with 389 additions and 414 deletions

41
bench/async.bench.ts Normal file
View File

@ -0,0 +1,41 @@
import { cpus } from 'node:os'
import { createRequire } from 'node:module'
import { bench } from 'vitest'
const require = createRequire(import.meta.url)
const {
benchAsyncTask,
benchThreadsafeFunction,
benchTokioFuture,
} = require('./index.node')
const buffer = Buffer.from('hello 🚀 rust!')
const ALL_THREADS = Array.from({ length: cpus().length })
bench('spawn task', async () => {
await Promise.all(ALL_THREADS.map(() => benchAsyncTask(buffer)))
})
bench('ThreadSafeFunction', async () => {
await Promise.all(
ALL_THREADS.map(
() =>
new Promise<number | undefined>((resolve, reject) => {
benchThreadsafeFunction(buffer, (err?: Error, value?: number) => {
if (err) {
reject(err)
} else {
resolve(value)
}
})
}),
),
)
})
bench('Tokio future to Promise', async () => {
await Promise.all(ALL_THREADS.map(() => benchTokioFuture(buffer)))
})

View File

@ -1,42 +0,0 @@
import { cpus } from 'os'
import b from 'benny'
const {
benchAsyncTask,
benchThreadsafeFunction,
benchTokioFuture,
} = require('./index.node')
const buffer = Buffer.from('hello 🚀 rust!')
const ALL_THREADS = Array.from({ length: cpus().length })
export const benchAsync = () =>
b.suite(
'Async task',
b.add('spawn task', async () => {
await Promise.all(ALL_THREADS.map(() => benchAsyncTask(buffer)))
}),
b.add('ThreadSafeFunction', async () => {
await Promise.all(
ALL_THREADS.map(
() =>
new Promise<number | undefined>((resolve, reject) => {
benchThreadsafeFunction(buffer, (err?: Error, value?: number) => {
if (err) {
reject(err)
} else {
resolve(value)
}
})
}),
),
)
}),
b.add('Tokio future to Promise', async () => {
await Promise.all(ALL_THREADS.map(() => benchTokioFuture(buffer)))
}),
b.cycle(),
b.complete(),
)

View File

@ -1,43 +0,0 @@
import { promises as fs } from 'fs'
import { join } from 'path'
import { Summary } from 'benny/lib/internal/common-types'
import { benchAsync } from './async'
import { benchBuffer } from './buffer'
import { benchCreateArray } from './create-array'
import { benchGetArray } from './get-array-from-js'
import { benchGetSetProperty } from './get-set-property'
import { benchNoop } from './noop'
import { benchPlus } from './plus'
import { benchQuery } from './query'
async function run() {
const output = [
await benchNoop(),
await benchPlus(),
await benchBuffer(),
await benchCreateArray(),
await benchGetArray(),
await benchGetSetProperty(),
await benchAsync(),
await benchQuery(),
]
.map(formatSummary)
.join('\n')
await fs.writeFile(join(process.cwd(), 'bench.txt'), output, 'utf8')
}
function formatSummary(summary: Summary): string {
return summary.results
.map(
(result) =>
`${summary.name}#${result.name} x ${result.ops} ops/sec ±${result.margin}% (${result.samples} runs sampled)`,
)
.join('\n')
}
run().catch((e) => {
console.error(e)
})

22
bench/buffer.bench.ts Normal file
View File

@ -0,0 +1,22 @@
import { createRequire } from 'node:module'
import { bench } from 'vitest'
const require = createRequire(import.meta.url)
const { benchCreateBuffer } = require('./index.node')
function createBuffer() {
const buf = Buffer.allocUnsafe(1024)
buf[0] = 1
buf[1] = 2
return buf
}
bench('napi-rs', () => {
benchCreateBuffer()
})
bench('JavaScript', () => {
createBuffer()
})

View File

@ -1,23 +0,0 @@
import b from 'benny'
const { benchCreateBuffer } = require('./index.node')
function createBuffer() {
const buf = Buffer.allocUnsafe(1024)
buf[0] = 1
buf[1] = 2
return buf
}
export const benchBuffer = () =>
b.suite(
'Create buffer',
b.add('napi-rs', () => {
benchCreateBuffer()
}),
b.add('JavaScript', () => {
createBuffer()
}),
b.cycle(),
b.complete(),
)

View File

@ -0,0 +1,23 @@
import { createRequire } from 'node:module'
import { bench } from 'vitest'
const require = createRequire(import.meta.url)
const {
createArrayJson,
createArray,
createArrayWithSerdeTrait,
} = require('./index.node')
bench('createArrayJson', () => {
JSON.parse(createArrayJson())
})
bench('create array for loop', () => {
createArray()
})
bench('create array with serde trait', () => {
createArrayWithSerdeTrait()
})

View File

@ -1,25 +0,0 @@
import b from 'benny'
const {
createArrayJson,
createArray,
createArrayWithSerdeTrait,
} = require('./index.node')
export const benchCreateArray = () =>
b.suite(
'createArray',
b.add('createArrayJson', () => {
JSON.parse(createArrayJson())
}),
b.add('create array for loop', () => {
createArray()
}),
b.add('create array with serde trait', () => {
createArrayWithSerdeTrait()
}),
b.cycle(),
b.complete(),
)

View File

@ -0,0 +1,25 @@
import { createRequire } from 'node:module'
import { bench } from 'vitest'
const require = createRequire(import.meta.url)
const {
getArrayFromJson,
getArrayFromJsArray,
getArrayWithForLoop,
} = require('./index.node')
const FIXTURE = Array.from({ length: 1000 }).fill(42)
bench('get array from json string', () => {
getArrayFromJson(JSON.stringify(FIXTURE))
})
bench('get array from serde', () => {
getArrayFromJsArray(FIXTURE)
})
bench('get array with for loop', () => {
getArrayWithForLoop(FIXTURE)
})

View File

@ -1,27 +0,0 @@
import b from 'benny'
const {
getArrayFromJson,
getArrayFromJsArray,
getArrayWithForLoop,
} = require('./index.node')
const FIXTURE = Array.from({ length: 1000 }).fill(42)
export const benchGetArray = () =>
b.suite(
'getArrayFromJs',
b.add('get array from json string', () => {
getArrayFromJson(JSON.stringify(FIXTURE))
}),
b.add('get array from serde', () => {
getArrayFromJsArray(FIXTURE)
}),
b.add('get array with for loop', () => {
getArrayWithForLoop(FIXTURE)
}),
b.cycle(),
b.complete(),
)

View File

@ -0,0 +1,51 @@
import { createRequire } from 'node:module'
import { bench } from 'vitest'
const require = createRequire(import.meta.url)
const { TestClass } = require('./index.node')
function createClass() {
const testObject = new TestClass()
Object.defineProperty(testObject, '_miterLimit', {
value: 10,
configurable: false,
enumerable: false,
writable: true,
})
Object.defineProperty(testObject, '_lineJoin', {
value: 'miter',
configurable: false,
enumerable: false,
writable: true,
})
return testObject
}
bench('Get Set from native#u32', () => {
const o = createClass()
o.miterNative
o.miterNative = 1
})
bench('Get Set from JavaScript#u32', () => {
const o = createClass()
o.miter
o.miter = 1
})
bench('Get Set from native#string', () => {
const o = createClass()
o.lineJoinNative
o.lineJoinNative = 'bevel'
})
bench('Get Set from JavaScript#string', () => {
const o = createClass()
o.lineJoin
o.lineJoin = 'bevel'
})

View File

@ -1,52 +0,0 @@
import b from 'benny'
const { TestClass } = require('./index.node')
function createClass() {
const testObject = new TestClass()
Object.defineProperty(testObject, '_miterLimit', {
value: 10,
configurable: false,
enumerable: false,
writable: true,
})
Object.defineProperty(testObject, '_lineJoin', {
value: 'miter',
configurable: false,
enumerable: false,
writable: true,
})
return testObject
}
export const benchGetSetProperty = () =>
b.suite(
'Get Set property',
b.add('Get Set from native#u32', () => {
const o = createClass()
o.miterNative
o.miterNative = 1
}),
b.add('Get Set from JavaScript#u32', () => {
const o = createClass()
o.miter
o.miter = 1
}),
b.add('Get Set from native#string', () => {
const o = createClass()
o.lineJoinNative
o.lineJoinNative = 'bevel'
}),
b.add('Get Set from JavaScript#string', () => {
const o = createClass()
o.lineJoin
o.lineJoin = 'bevel'
}),
b.cycle(),
b.complete(),
)

17
bench/noop.bench.ts Normal file
View File

@ -0,0 +1,17 @@
import { createRequire } from 'node:module'
import { bench } from 'vitest'
const require = createRequire(import.meta.url)
const { noop: napiNoop } = require('./index.node')
function noop() {}
bench('napi-rs', () => {
napiNoop()
})
bench('JavaScript', () => {
noop()
})

View File

@ -1,19 +0,0 @@
import b from 'benny'
const { noop: napiNoop } = require('./index.node')
function noop() {}
export const benchNoop = () =>
b.suite(
'noop',
b.add('napi-rs', () => {
napiNoop()
}),
b.add('JavaScript', () => {
noop()
}),
b.cycle(),
b.complete(),
)

View File

@ -2,11 +2,14 @@
"name": "bench",
"version": "1.0.0",
"private": true,
"type": "module",
"scripts": {
"bench": "vitest bench ",
"build": "napi-raw build --js false --release"
},
"devDependencies": {
"@napi-rs/cli": "workspace:*",
"benny": "^3.7.1"
"tinybench": "^4.0.1",
"vitest": "^3.1.3"
}
}

19
bench/plus.bench.ts Normal file
View File

@ -0,0 +1,19 @@
import { createRequire } from 'node:module'
import { bench } from 'vitest'
const require = createRequire(import.meta.url)
const { plus } = require('./index.node')
function plusJavascript(a: number, b: number) {
return a + b
}
bench('napi-rs', () => {
plus(1, 100)
})
bench('JavaScript', () => {
plusJavascript(1, 100)
})

View File

@ -1,21 +0,0 @@
import b from 'benny'
const { plus } = require('./index.node')
function plusJavascript(a: number, b: number) {
return a + b
}
export const benchPlus = () =>
b.suite(
'Plus number',
b.add('napi-rs', () => {
plus(1, 100)
}),
b.add('JavaScript', () => {
plusJavascript(1, 100)
}),
b.cycle(),
b.complete(),
)

17
bench/query.bench.ts Normal file
View File

@ -0,0 +1,17 @@
import { createRequire } from 'node:module'
import { bench } from 'vitest'
const require = createRequire(import.meta.url)
const { query, engine } = require('./index.node')
const e = engine('model A {}')
bench('query * 100', async () => {
await Promise.all(Array.from({ length: 100 }).map(() => query(e)))
})
bench('query * 1', async () => {
await query(e)
})

View File

@ -1,19 +0,0 @@
import b from 'benny'
const { query, engine } = require('./index.node')
const e = engine('model A {}')
export const benchQuery = () =>
b.suite(
'Query',
b.add('query * 100', async () => {
await Promise.all(Array.from({ length: 100 }).map(() => query(e)))
}),
b.add('query * 1', async () => {
await query(e)
}),
b.cycle(),
b.complete(),
)

View File

@ -2,6 +2,8 @@
"extends": "../tsconfig.json",
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
"moduleResolution": "bundler",
"rootDir": "."
},
"include": ["."],

5
bench/vite.config.ts Normal file
View File

@ -0,0 +1,5 @@
import { defineConfig } from 'vitest/config'
export default defineConfig({
mode: 'benchmark',
})

View File

@ -18,7 +18,7 @@
},
"license": "MIT",
"scripts": {
"bench": "cross-env TS_NODE_PROJECT='./bench/tsconfig.json' node -r ts-node/register/transpile-only bench/bench.ts",
"bench": "yarn workspace bench bench",
"build": "lerna run build --scope '@napi-rs/*'",
"build:bench": "yarn workspace bench build",
"build:memory": "yarn workspace memory-testing build",
@ -87,7 +87,6 @@
"shx": "^0.4.0",
"sinon": "^20.0.0",
"source-map-support": "^0.5.21",
"ts-node": "^10.9.2",
"tslib": "^2.8.1",
"typescript": "^5.8.2"
},

302
yarn.lock
View File

@ -5,50 +5,6 @@ __metadata:
version: 8
cacheKey: 10c0
"@arrows/array@npm:^1.4.1":
version: 1.4.1
resolution: "@arrows/array@npm:1.4.1"
dependencies:
"@arrows/composition": "npm:^1.2.2"
checksum: 10c0/8516a08df3dca85e62386bd25366df368ccaf74b3d0812865850ef20b02f04adf7a9948fa0bdab7251ca7e9cb88a2f65663267dc3f315ec7cce3d18171fe305d
languageName: node
linkType: hard
"@arrows/composition@npm:^1.0.0, @arrows/composition@npm:^1.2.2":
version: 1.2.2
resolution: "@arrows/composition@npm:1.2.2"
checksum: 10c0/d8b07682b2f6cba12a8d8e1bec0457acc6456683c2f1fa7377680be11990377a4c089eb7c5bb597c90a25754a2237ad6bba5a41f21924d247c9702cc994df87c
languageName: node
linkType: hard
"@arrows/dispatch@npm:^1.0.2":
version: 1.0.3
resolution: "@arrows/dispatch@npm:1.0.3"
dependencies:
"@arrows/composition": "npm:^1.2.2"
checksum: 10c0/302c63727cd78f8227409a0c70daa7869f4690c2803bbbd730f5c87cb2e636bbc74cf5cc1d2037dad8994ca19c69a3763088dddd15e1d729e1dd1c72c6b63015
languageName: node
linkType: hard
"@arrows/error@npm:^1.0.2":
version: 1.0.2
resolution: "@arrows/error@npm:1.0.2"
checksum: 10c0/b8e003d8f9b4743a3dafc61985706cc59678d8d2f125ce250821284cac33eea3f877dc0a3626b196f48863b55da9f0917dad48929e9350c2459176131c8dee26
languageName: node
linkType: hard
"@arrows/multimethod@npm:^1.1.6":
version: 1.4.1
resolution: "@arrows/multimethod@npm:1.4.1"
dependencies:
"@arrows/array": "npm:^1.4.1"
"@arrows/composition": "npm:^1.2.2"
"@arrows/error": "npm:^1.0.2"
fast-deep-equal: "npm:^3.1.3"
checksum: 10c0/760bc4781cc66531990eb8dfbb40ef48b7b21be832dce272dad2a2cc0a7d200e45e816ae3ebba3e9daa2e2bd6498413994c6d3cd5c088e34673b37d93609df3c
languageName: node
linkType: hard
"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4":
version: 7.27.1
resolution: "@babel/code-frame@npm:7.27.1"
@ -3158,6 +3114,18 @@ __metadata:
languageName: node
linkType: hard
"@vitest/expect@npm:3.1.3":
version: 3.1.3
resolution: "@vitest/expect@npm:3.1.3"
dependencies:
"@vitest/spy": "npm:3.1.3"
"@vitest/utils": "npm:3.1.3"
chai: "npm:^5.2.0"
tinyrainbow: "npm:^2.0.0"
checksum: 10c0/3a61e5526ed57491c9c230cb592849a2c15e6b4376bfaec4f623ac75fdcf5c24c322949cfb5362136fc8be5eb19be88d094917ea5f700bd3da0ea0c68ee4a8d9
languageName: node
linkType: hard
"@vitest/mocker@npm:3.1.2":
version: 3.1.2
resolution: "@vitest/mocker@npm:3.1.2"
@ -3177,6 +3145,25 @@ __metadata:
languageName: node
linkType: hard
"@vitest/mocker@npm:3.1.3":
version: 3.1.3
resolution: "@vitest/mocker@npm:3.1.3"
dependencies:
"@vitest/spy": "npm:3.1.3"
estree-walker: "npm:^3.0.3"
magic-string: "npm:^0.30.17"
peerDependencies:
msw: ^2.4.9
vite: ^5.0.0 || ^6.0.0
peerDependenciesMeta:
msw:
optional: true
vite:
optional: true
checksum: 10c0/6e6a62e27aa6cd146d14ae64eb9acfc0f49e7479ca426af1fb4df362456aa3456abf29731247659032e4bfb7ac9482fca1d1c7e1501e1a186eb211221e1f613a
languageName: node
linkType: hard
"@vitest/pretty-format@npm:3.1.2, @vitest/pretty-format@npm:^3.1.2":
version: 3.1.2
resolution: "@vitest/pretty-format@npm:3.1.2"
@ -3186,6 +3173,15 @@ __metadata:
languageName: node
linkType: hard
"@vitest/pretty-format@npm:3.1.3, @vitest/pretty-format@npm:^3.1.3":
version: 3.1.3
resolution: "@vitest/pretty-format@npm:3.1.3"
dependencies:
tinyrainbow: "npm:^2.0.0"
checksum: 10c0/eba164d2c0b2babbcf6bb054da3b326d08cc3a0289ade3c64309bfe5e7c3124cd4d45a60b2f673cf4f5b3a97381fb7af7009780a5d9665afdf7f8263fa34c068
languageName: node
linkType: hard
"@vitest/runner@npm:3.1.2":
version: 3.1.2
resolution: "@vitest/runner@npm:3.1.2"
@ -3196,6 +3192,16 @@ __metadata:
languageName: node
linkType: hard
"@vitest/runner@npm:3.1.3":
version: 3.1.3
resolution: "@vitest/runner@npm:3.1.3"
dependencies:
"@vitest/utils": "npm:3.1.3"
pathe: "npm:^2.0.3"
checksum: 10c0/f03c26e72657242ce68a93b46ee8a4e6fa1a290850be608988622a3efef744ffadc0436123acafe61977608b287b1637f4f781d27107ee0c33937c54f547159d
languageName: node
linkType: hard
"@vitest/snapshot@npm:3.1.2":
version: 3.1.2
resolution: "@vitest/snapshot@npm:3.1.2"
@ -3207,6 +3213,17 @@ __metadata:
languageName: node
linkType: hard
"@vitest/snapshot@npm:3.1.3":
version: 3.1.3
resolution: "@vitest/snapshot@npm:3.1.3"
dependencies:
"@vitest/pretty-format": "npm:3.1.3"
magic-string: "npm:^0.30.17"
pathe: "npm:^2.0.3"
checksum: 10c0/60b70c1d878c3d9a4fe3464d14be2318a7a3be24131beb801712735d5dcbc7db7b798f21c98c6fbad4998554992038b29655e1b6e2503242627f203fd89c97c3
languageName: node
linkType: hard
"@vitest/spy@npm:3.1.2":
version: 3.1.2
resolution: "@vitest/spy@npm:3.1.2"
@ -3216,6 +3233,15 @@ __metadata:
languageName: node
linkType: hard
"@vitest/spy@npm:3.1.3":
version: 3.1.3
resolution: "@vitest/spy@npm:3.1.3"
dependencies:
tinyspy: "npm:^3.0.2"
checksum: 10c0/6a8c187069827c56f3492f212ccf76c797fe52392849948af736a0f579e4533fa91041d829e2574b252af4aaadec066ca0714450d6457b31526153978bc55192
languageName: node
linkType: hard
"@vitest/ui@npm:^3.1.1":
version: 3.1.2
resolution: "@vitest/ui@npm:3.1.2"
@ -3244,6 +3270,17 @@ __metadata:
languageName: node
linkType: hard
"@vitest/utils@npm:3.1.3":
version: 3.1.3
resolution: "@vitest/utils@npm:3.1.3"
dependencies:
"@vitest/pretty-format": "npm:3.1.3"
loupe: "npm:^3.1.3"
tinyrainbow: "npm:^2.0.0"
checksum: 10c0/1c4ea711b87a8b2c7dc2da91f20427dccc34c0d1d0e81b8142780d24b6caa3c724e8287f7e01e9e875262b6bb912d55711fb99e66f718ba30cc21706a335829d
languageName: node
linkType: hard
"@wdio/config@npm:9.12.6":
version: 9.12.6
resolution: "@wdio/config@npm:9.12.6"
@ -3456,7 +3493,7 @@ __metadata:
languageName: node
linkType: hard
"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0, ansi-escapes@npm:^4.3.2":
"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.2":
version: 4.3.2
resolution: "ansi-escapes@npm:4.3.2"
dependencies:
@ -3907,37 +3944,11 @@ __metadata:
resolution: "bench@workspace:bench"
dependencies:
"@napi-rs/cli": "workspace:*"
benny: "npm:^3.7.1"
tinybench: "npm:^4.0.1"
vitest: "npm:^3.1.3"
languageName: unknown
linkType: soft
"benchmark@npm:^2.1.4":
version: 2.1.4
resolution: "benchmark@npm:2.1.4"
dependencies:
lodash: "npm:^4.17.4"
platform: "npm:^1.3.3"
checksum: 10c0/510224c01f7578e9aa60cef67ec3dd8f84ac6670007bcc96285f87865375122aca0853ab4e542cc80cfeeed436356dfdd63bb66cb5e72365abb912685b2139be
languageName: node
linkType: hard
"benny@npm:^3.7.1":
version: 3.7.1
resolution: "benny@npm:3.7.1"
dependencies:
"@arrows/composition": "npm:^1.0.0"
"@arrows/dispatch": "npm:^1.0.2"
"@arrows/multimethod": "npm:^1.1.6"
benchmark: "npm:^2.1.4"
common-tags: "npm:^1.8.0"
fs-extra: "npm:^10.0.0"
json2csv: "npm:^5.0.6"
kleur: "npm:^4.1.4"
log-update: "npm:^4.0.0"
checksum: 10c0/3f731a58aa5d7483f0cce69bd62f9db0589c0f86e677669397a64ad56e85a307e340e9a957b19da51feab8ddb3082039b6bfa71fefd00a4b195a11420a8c9b03
languageName: node
linkType: hard
"bin-links@npm:^4.0.4":
version: 4.0.4
resolution: "bin-links@npm:4.0.4"
@ -4733,13 +4744,6 @@ __metadata:
languageName: node
linkType: hard
"commander@npm:^6.1.0":
version: 6.2.1
resolution: "commander@npm:6.2.1"
checksum: 10c0/85748abd9d18c8bc88febed58b98f66b7c591d9b5017cad459565761d7b29ca13b7783ea2ee5ce84bf235897333706c4ce29adf1ce15c8252780e7000e2ce9ea
languageName: node
linkType: hard
"commander@npm:^9.3.0":
version: 9.5.0
resolution: "commander@npm:9.5.0"
@ -4761,13 +4765,6 @@ __metadata:
languageName: node
linkType: hard
"common-tags@npm:^1.8.0":
version: 1.8.2
resolution: "common-tags@npm:1.8.2"
checksum: 10c0/23efe47ff0a1a7c91489271b3a1e1d2a171c12ec7f9b35b29b2fce51270124aff0ec890087e2bc2182c1cb746e232ab7561aaafe05f1e7452aea733d2bfe3f63
languageName: node
linkType: hard
"commondir@npm:^1.0.1":
version: 1.0.1
resolution: "commondir@npm:1.0.1"
@ -5793,7 +5790,7 @@ __metadata:
languageName: node
linkType: hard
"es-module-lexer@npm:^1.6.0":
"es-module-lexer@npm:^1.6.0, es-module-lexer@npm:^1.7.0":
version: 1.7.0
resolution: "es-module-lexer@npm:1.7.0"
checksum: 10c0/4c935affcbfeba7fb4533e1da10fa8568043df1e3574b869385980de9e2d475ddc36769891936dbb07036edb3c3786a8b78ccf44964cd130dedc1f2c984b6c7b
@ -6394,17 +6391,6 @@ __metadata:
languageName: node
linkType: hard
"fs-extra@npm:^10.0.0":
version: 10.1.0
resolution: "fs-extra@npm:10.1.0"
dependencies:
graceful-fs: "npm:^4.2.0"
jsonfile: "npm:^6.0.1"
universalify: "npm:^2.0.0"
checksum: 10c0/5f579466e7109719d162a9249abbeffe7f426eb133ea486e020b89bc6d67a741134076bf439983f2eb79276ceaf6bd7b7c1e43c3fd67fe889863e69072fb0a5e
languageName: node
linkType: hard
"fs-extra@npm:^11.2.0":
version: 11.3.0
resolution: "fs-extra@npm:11.3.0"
@ -7744,19 +7730,6 @@ __metadata:
languageName: node
linkType: hard
"json2csv@npm:^5.0.6":
version: 5.0.7
resolution: "json2csv@npm:5.0.7"
dependencies:
commander: "npm:^6.1.0"
jsonparse: "npm:^1.3.1"
lodash.get: "npm:^4.4.2"
bin:
json2csv: bin/json2csv.js
checksum: 10c0/4a4240c2f39ce89ff8c51296cee710ca1a0f487cc5a5ab4035a590f03fe19aa9f0883f2ea8ce68515c30d1f1e733ed594fde8a50b29a19893bdcfe2796f83689
languageName: node
linkType: hard
"json5@npm:^2.2.2":
version: 2.2.3
resolution: "json5@npm:2.2.3"
@ -7847,13 +7820,6 @@ __metadata:
languageName: node
linkType: hard
"kleur@npm:^4.1.4":
version: 4.1.5
resolution: "kleur@npm:4.1.5"
checksum: 10c0/e9de6cb49657b6fa70ba2d1448fd3d691a5c4370d8f7bbf1c2f64c24d461270f2117e1b0afe8cb3114f13bbd8e51de158c2a224953960331904e636a5e4c0f2a
languageName: node
linkType: hard
"lazystream@npm:^1.0.0":
version: 1.0.1
resolution: "lazystream@npm:1.0.1"
@ -8162,7 +8128,7 @@ __metadata:
languageName: node
linkType: hard
"lodash@npm:^4.17.15, lodash@npm:^4.17.21, lodash@npm:^4.17.4":
"lodash@npm:^4.17.15, lodash@npm:^4.17.21":
version: 4.17.21
resolution: "lodash@npm:4.17.21"
checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c
@ -8179,18 +8145,6 @@ __metadata:
languageName: node
linkType: hard
"log-update@npm:^4.0.0":
version: 4.0.0
resolution: "log-update@npm:4.0.0"
dependencies:
ansi-escapes: "npm:^4.3.0"
cli-cursor: "npm:^3.1.0"
slice-ansi: "npm:^4.0.0"
wrap-ansi: "npm:^6.2.0"
checksum: 10c0/18b299e230432a156f2535660776406d15ba8bb7817dd3eaadd58004b363756d4ecaabcd658f9949f90b62ea7d3354423be3fdeb7a201ab951ec0e8d6139af86
languageName: node
linkType: hard
"log-update@npm:^6.1.0":
version: 6.1.0
resolution: "log-update@npm:6.1.0"
@ -8893,7 +8847,6 @@ __metadata:
shx: "npm:^0.4.0"
sinon: "npm:^20.0.0"
source-map-support: "npm:^0.5.21"
ts-node: "npm:^10.9.2"
tslib: "npm:^2.8.1"
typescript: "npm:^5.8.2"
languageName: unknown
@ -10074,13 +10027,6 @@ __metadata:
languageName: node
linkType: hard
"platform@npm:^1.3.3":
version: 1.3.6
resolution: "platform@npm:1.3.6"
checksum: 10c0/69f2eb692e15f1a343dd0d9347babd9ca933824c8673096be746ff66f99f2bdc909fadd8609076132e6ec768349080babb7362299f2a7f885b98f1254ae6224b
languageName: node
linkType: hard
"playwright-core@npm:1.52.0":
version: 1.52.0
resolution: "playwright-core@npm:1.52.0"
@ -11818,6 +11764,13 @@ __metadata:
languageName: node
linkType: hard
"tinybench@npm:^4.0.1":
version: 4.0.1
resolution: "tinybench@npm:4.0.1"
checksum: 10c0/42ed8abf2eb914cfbff2cede5fa98cca7dcaf135ab5342a3701d2f90ed3d29fc1a2dcc092a91b1dc483d0de1fa69feac3fea64fad2ddef284bba34391bc96405
languageName: node
linkType: hard
"tinyexec@npm:^0.3.2":
version: 0.3.2
resolution: "tinyexec@npm:0.3.2"
@ -12328,6 +12281,21 @@ __metadata:
languageName: node
linkType: hard
"vite-node@npm:3.1.3":
version: 3.1.3
resolution: "vite-node@npm:3.1.3"
dependencies:
cac: "npm:^6.7.14"
debug: "npm:^4.4.0"
es-module-lexer: "npm:^1.7.0"
pathe: "npm:^2.0.3"
vite: "npm:^5.0.0 || ^6.0.0"
bin:
vite-node: vite-node.mjs
checksum: 10c0/d69a1e52361bc0af22d1178db61674ef768cfd3c5610733794bb1e7a36af113da287dd89662a1ad57fd4f6c3360ca99678f5428ba837f239df4091d7891f2e4c
languageName: node
linkType: hard
"vite-plugin-node-polyfills@npm:^0.23.0":
version: 0.23.0
resolution: "vite-plugin-node-polyfills@npm:0.23.0"
@ -12449,6 +12417,60 @@ __metadata:
languageName: node
linkType: hard
"vitest@npm:^3.1.3":
version: 3.1.3
resolution: "vitest@npm:3.1.3"
dependencies:
"@vitest/expect": "npm:3.1.3"
"@vitest/mocker": "npm:3.1.3"
"@vitest/pretty-format": "npm:^3.1.3"
"@vitest/runner": "npm:3.1.3"
"@vitest/snapshot": "npm:3.1.3"
"@vitest/spy": "npm:3.1.3"
"@vitest/utils": "npm:3.1.3"
chai: "npm:^5.2.0"
debug: "npm:^4.4.0"
expect-type: "npm:^1.2.1"
magic-string: "npm:^0.30.17"
pathe: "npm:^2.0.3"
std-env: "npm:^3.9.0"
tinybench: "npm:^2.9.0"
tinyexec: "npm:^0.3.2"
tinyglobby: "npm:^0.2.13"
tinypool: "npm:^1.0.2"
tinyrainbow: "npm:^2.0.0"
vite: "npm:^5.0.0 || ^6.0.0"
vite-node: "npm:3.1.3"
why-is-node-running: "npm:^2.3.0"
peerDependencies:
"@edge-runtime/vm": "*"
"@types/debug": ^4.1.12
"@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0
"@vitest/browser": 3.1.3
"@vitest/ui": 3.1.3
happy-dom: "*"
jsdom: "*"
peerDependenciesMeta:
"@edge-runtime/vm":
optional: true
"@types/debug":
optional: true
"@types/node":
optional: true
"@vitest/browser":
optional: true
"@vitest/ui":
optional: true
happy-dom:
optional: true
jsdom:
optional: true
bin:
vitest: vitest.mjs
checksum: 10c0/954b3579a2d925606df7f78e367ae64eab52c8c5ba2bb2fed94d335a06c910202a4ce080bb02d8148c8b4782488c6d229e963617be8d0c7da96a1c944dd291d7
languageName: node
linkType: hard
"vm-browserify@npm:^1.0.1":
version: 1.1.2
resolution: "vm-browserify@npm:1.1.2"