Skip to content

Commit d68a739

Browse files
authoredFeb 22, 2024··
fix(coverage): expensive regexp hangs v8 report generation (#5259)
1 parent ec6f56a commit d68a739

File tree

8 files changed

+271
-20
lines changed

8 files changed

+271
-20
lines changed
 

‎examples/nestjs/package.json

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"name": "@vitest/example-nestjs",
3+
"type": "module",
4+
"private": true,
5+
"license": "MIT",
6+
"main": "index.js",
7+
"scripts": {
8+
"test": "vitest",
9+
"test:ui": "vitest --ui",
10+
"test:run": "vitest run"
11+
},
12+
"devDependencies": {
13+
"@nestjs/common": "^10.3.3",
14+
"@nestjs/testing": "^10.3.3",
15+
"@vitest/coverage-v8": "^1.3.1",
16+
"unplugin-swc": "^1.4.4",
17+
"vitest": "1.3.1"
18+
},
19+
"stackblitz": {
20+
"startCommand": "npm run test:ui"
21+
}
22+
}
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { Body, Controller, Get, Post } from '@nestjs/common'
2+
import type { Cat, CatsService } from './cats.service'
3+
4+
@Controller('cats')
5+
export class CatsController {
6+
constructor(private catsService: CatsService) {}
7+
8+
@Post()
9+
async create(@Body() createCatDto: Cat) {
10+
this.catsService.create(createCatDto)
11+
}
12+
13+
@Get()
14+
async findAll(): Promise<Cat[]> {
15+
return this.catsService.findAll()
16+
}
17+
}

‎examples/nestjs/src/cats.service.ts

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { Injectable } from '@nestjs/common'
2+
3+
export interface Cat {
4+
name: string
5+
age: number
6+
breed: string
7+
}
8+
9+
@Injectable()
10+
export class CatsService {
11+
private readonly cats: Cat[] = []
12+
13+
create(cat: Cat) {
14+
this.cats.push(cat)
15+
}
16+
17+
findAll(): Cat[] {
18+
return this.cats
19+
}
20+
}

‎examples/nestjs/test/nestjs.test.ts

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { beforeEach, describe, expect, it, vi } from 'vitest'
2+
import { CatsController } from '../src/cats.controller'
3+
import type { Cat } from '../src/cats.service'
4+
import { CatsService } from '../src/cats.service'
5+
6+
describe('CatsController', () => {
7+
let catsController: CatsController
8+
let catsService: CatsService
9+
10+
beforeEach(() => {
11+
catsService = new CatsService()
12+
catsController = new CatsController(catsService)
13+
})
14+
15+
describe('findAll', () => {
16+
it('should return an array of cats', async () => {
17+
const result = ['test'] as unknown as Cat[]
18+
vi.spyOn(catsService, 'findAll').mockImplementation(() => result)
19+
20+
expect(await catsController.findAll()).toBe(result)
21+
})
22+
})
23+
})

‎examples/nestjs/tsconfig.json

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"extends": "../../tsconfig.base.json",
3+
"compilerOptions": {
4+
"experimentalDecorators": true
5+
}
6+
}

‎examples/nestjs/vitest.config.ts

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import swc from 'unplugin-swc'
2+
import { defineConfig } from 'vitest/config'
3+
4+
export default defineConfig({
5+
plugins: [
6+
swc.vite({
7+
jsc: {
8+
target: 'esnext',
9+
parser: {
10+
syntax: 'typescript',
11+
decorators: true,
12+
},
13+
transform: {
14+
legacyDecorator: true,
15+
decoratorMetadata: true,
16+
},
17+
},
18+
}),
19+
],
20+
test: {
21+
coverage: {
22+
enabled: true,
23+
provider: 'v8',
24+
thresholds: {
25+
branches: 100,
26+
functions: 57.14,
27+
lines: 81.08,
28+
statements: 81.08,
29+
},
30+
},
31+
},
32+
})

‎packages/coverage-v8/src/provider.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ const WRAPPER_LENGTH = 185
5151

5252
// Note that this needs to match the line ending as well
5353
const VITE_EXPORTS_LINE_PATTERN = /Object\.defineProperty\(__vite_ssr_exports__.*\n/g
54-
const DECORATOR_METADATA_PATTERN = /_ts_metadata\("design:paramtypes"(\s|.)+?]\),/g
54+
const DECORATOR_METADATA_PATTERN = /_ts_metadata\("design:paramtypes", \[[^\]]*?\]\),*/g
5555
const DEFAULT_PROJECT = Symbol.for('default-project')
5656

5757
const debug = createDebug('vitest:coverage')

‎pnpm-lock.yaml

+150-19
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)
Please sign in to comment.