Visitar URL original
chore: Update to Vitest 5 and move hook benchmarks to vitest bench (v… · feathersjs/feathers@51c6603 · GitHub
Skip to content

Commit 51c6603

Browse files
authored
chore: Update to Vitest 5 and move hook benchmarks to vitest bench (v6) (#3722)
1 parent b4c71a2 commit 51c6603

9 files changed

Lines changed: 726 additions & 2008 deletions

File tree

‎.github/workflows/nodejs.yml‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,8 @@ jobs:
2020
- run: npm test
2121
env:
2222
CI: true
23+
- name: Run benchmarks (non-blocking)
24+
run: npm run bench
25+
continue-on-error: true
26+
env:
27+
CI: true

‎package-lock.json‎

Lines changed: 646 additions & 1933 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎package.json‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,20 +43,22 @@
4343
"test:deno": "deno test --config deno/tsconfig.json deno/test.ts",
4444
"test": "npm run lint && npm run compile && vitest run --coverage",
4545
"vitest": "vitest run --coverage",
46+
"bench": "vitest bench --run",
4647
"dev": "vitest"
4748
},
4849
"devDependencies": {
4950
"@featherscloud/pinion": "^0.5.5",
5051
"@typescript-eslint/eslint-plugin": "^8.38.0",
5152
"@typescript-eslint/parser": "^8.38.0",
52-
"@vitest/coverage-v8": "^3.2.4",
53+
"@vitest/coverage-v8": "^5.0.5",
5354
"eslint": "^9.32.0",
5455
"eslint-config-prettier": "^10.1.8",
5556
"eslint-plugin-prettier": "^5.5.3",
5657
"lerna": "^8.2.3",
5758
"npm-check-updates": "^18.0.2",
5859
"prettier": "^3.6.2",
5960
"typescript": "^5.8.0",
60-
"vitest": "^3.2.4"
61+
"vite": "^7.3.7",
62+
"vitest": "^5.0.5"
6163
}
6264
}

‎packages/create-feathers/package.json‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,8 @@
5252
"gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5",
5353
"devDependencies": {
5454
"@types/node": "^24.1.0",
55-
"@vitest/coverage-v8": "^5.0.0",
5655
"shx": "^0.4.0",
57-
"typescript": "^7.0.2",
58-
"vitest": "^5.0.0"
56+
"typescript": "^7.0.2"
5957
},
6058
"dependencies": {
6159
"@featherscloud/pinion": "^0.5.7",

‎packages/feathers/package.json‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,8 @@
112112
},
113113
"devDependencies": {
114114
"@types/node": "^25.5.0",
115-
"@vitest/coverage-v8": "^5.0.0",
116115
"shx": "^0.4.0",
117-
"typescript": "^7.0.2",
118-
"vitest": "^5.0.0"
116+
"typescript": "^7.0.2"
119117
},
120118
"gitHead": "5796fdf52a5ca94f993fe3c588767b75534d2e09"
121119
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { describe, expect, test } from 'vitest'
2+
import { HookContext, hooks, middleware, NextFunction } from './index.js'
3+
4+
// A hooked function must not be more than this many times slower than the plain function
5+
const MAX_OVERHEAD = 10
6+
// The iterations of compared benchmarks are interleaved so system load affects them equally
7+
const RUN_OPTIONS = { time: 500, warmupTime: 100 }
8+
9+
const hello = async (name: string, _params: any = {}) => {
10+
return `Hello ${name}`
11+
}
12+
13+
const benchmarks = [
14+
['empty hook', hooks(hello, middleware([]))],
15+
[
16+
'single simple hook',
17+
hooks(
18+
hello,
19+
middleware([
20+
async (_ctx: HookContext, next: NextFunction) => {
21+
await next()
22+
}
23+
])
24+
)
25+
],
26+
[
27+
'single hook, withParams and props',
28+
hooks(
29+
hello,
30+
middleware([
31+
async (_ctx: HookContext, next: NextFunction) => {
32+
await next()
33+
}
34+
])
35+
.params('name')
36+
.props({ dave: true })
37+
)
38+
]
39+
] as const
40+
41+
describe('feathers/hooks benchmark', () => {
42+
for (const [name, hookHello] of benchmarks) {
43+
test(name, async ({ bench }) => {
44+
const results = await bench.compare(
45+
bench('baseline', () => hello('Dave')),
46+
bench(name, () => hookHello('Dave')),
47+
RUN_OPTIONS
48+
)
49+
// Compare the medians since single garbage collection pauses skew the mean
50+
const overhead = results.get(name).latency.p50 / results.get('baseline').latency.p50
51+
52+
expect(overhead).toBeLessThan(MAX_OVERHEAD)
53+
})
54+
}
55+
})

‎packages/feathers/src/hooks/benchmark.test.ts‎

Lines changed: 0 additions & 65 deletions
This file was deleted.

‎packages/feathers/tsconfig.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"extends": "../../tsconfig",
33
"include": ["src/**/*.ts"],
4-
"exclude": ["src/**/*.test.ts", "src/**/test/**"],
4+
"exclude": ["src/**/*.test.ts", "src/**/*.bench.ts", "src/**/test/**"],
55
"compilerOptions": {
66
"rootDir": "src",
77
"outDir": "lib",

‎vitest.config.ts‎

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,22 @@ import { defineConfig } from 'vitest/config'
33
export default defineConfig({
44
test: {
55
include: ['packages/**/src/**/*.{test,spec}.{js,ts,tsx,jsx}'],
6+
benchmark: {
7+
include: ['packages/**/src/**/*.bench.ts']
8+
},
69
coverage: {
710
provider: 'v8',
811
include: ['packages/*/src/**/*.{js,ts,tsx,jsx}'],
9-
exclude: ['**/*.test.{js,ts,tsx,jsx}', '**/*.spec.{js,ts,tsx,jsx}', '**/node_modules/**', '**/lib/**', '**/dist/**', '**/*.d.ts', '**/fixtures/**'],
12+
exclude: [
13+
'**/*.test.{js,ts,tsx,jsx}',
14+
'**/*.spec.{js,ts,tsx,jsx}',
15+
'**/*.bench.ts',
16+
'**/node_modules/**',
17+
'**/lib/**',
18+
'**/dist/**',
19+
'**/*.d.ts',
20+
'**/fixtures/**'
21+
],
1022
reporter: ['text', 'html', 'lcov']
1123
}
1224
}

0 commit comments

Comments
 (0)