Skip to content

Commit 5049c48

Browse files
committed
update middlewares
1 parent 77077cf commit 5049c48

File tree

8 files changed

+896
-49
lines changed

8 files changed

+896
-49
lines changed

lib/common/common-utils.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
const debug = require('debug')('code-coverage')
2+
13
// @ts-check
24
function stringToArray(prop, obj) {
35
if (typeof obj[prop] === 'string') {
@@ -62,6 +64,7 @@ const removePlaceholders = (coverage) => {
6264
}
6365

6466
module.exports = {
67+
debug,
6568
combineNycOptions,
6669
defaultNycOptions,
6770
fileCoveragePlaceholder,

lib/register/getCoverage.js renamed to lib/register/v8Interface.js

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ const { convertProfileCoverageToIstanbul } = require('../common/v8ToIstanbul')
66
* @see https://github.com/bcoe/c8/issues/376
77
* @see https://github.com/tapjs/processinfo/blob/33c72e547139630cde35a4126bb4575ad7157065/lib/register-coverage.cjs
88
*/
9-
const getCoverage = async () => {
9+
const takePreciseCoverage = async () => {
1010
return new Promise((resolve, reject) => {
11-
session.post('Profiler.takePreciseCoverage', async (er, cov) => {
11+
session.post('Profiler.takePreciseCoverage', async (err, cov) => {
1212
/* istanbul ignore next - something very strange and bad happened */
13-
if (er) {
14-
reject(er)
13+
if (err) {
14+
reject(err)
1515
return
1616
}
1717

@@ -20,6 +20,21 @@ const getCoverage = async () => {
2020
})
2121
}
2222

23+
const stopPreciseCoverage = async () => {
24+
return new Promise((resolve, reject) => {
25+
session.post('Profiler.stopPreciseCoverage', async (err) => {
26+
/* istanbul ignore next - something very strange and bad happened */
27+
if (err) {
28+
reject(err)
29+
return
30+
}
31+
32+
resolve(null)
33+
})
34+
})
35+
}
36+
2337
module.exports = {
24-
getCoverage
38+
takePreciseCoverage,
39+
stopPreciseCoverage
2540
}

middleware/express.js

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// @ts-check
22
const { isCoverageEnabled } = require('../lib/common/isEnabled')
3+
const { debug } = require('../lib/common/common-utils');
34

45
/**
56
* for Express.js
@@ -12,24 +13,36 @@ const { isCoverageEnabled } = require('../lib/common/isEnabled')
1213
* require('cypress-code-coverage-v8/middleware/express')(app)
1314
* ```
1415
*
16+
* Then add to your cypress.json an environment variable pointing at the API
17+
* ```json
18+
* {
19+
* "baseUrl": "http://localhost:3000",
20+
* "env": {
21+
* "codeCoverage": {
22+
* "api": "http://localhost:4000/__coverage__"
23+
* }
24+
* }
25+
* }
26+
* ```
27+
*
1528
* @param {import('express').Application} app
1629
*/
1730
module.exports = (app) => {
31+
if (!isCoverageEnabled()) {
32+
debug('skipping express middleware, code coverage is not enabled')
33+
return
34+
}
35+
36+
const {
37+
takePreciseCoverage
38+
} = require('../lib/register/v8Interface')
39+
1840
// expose "GET __coverage__" endpoint that just returns
1941
// global coverage information (if the application has been instrumented)
2042
app.get('/__coverage__', async (req, res, next) => {
21-
if (!isCoverageEnabled()) {
22-
res.json({
23-
coverage: null
24-
})
25-
return
26-
}
27-
28-
const { getCoverage } = require('../lib/register/getCoverage')
29-
3043
try {
3144
res.json({
32-
coverage: (await getCoverage()) || null
45+
coverage: (await takePreciseCoverage()) || null
3346
})
3447
} catch (error) {
3548
return next(error)

middleware/hapi.js

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// @ts-check
22
const { isCoverageEnabled } = require('../lib/common/isEnabled')
3+
const { debug } = require('../lib/common/common-utils');
34

45
/**
56
* for Hapi.js
@@ -22,10 +23,29 @@ const { isCoverageEnabled } = require('../lib/common/isEnabled')
2223
* console.log('Server running on %s', server.info.uri);
2324
* };
2425
* ```
26+
*
27+
* Then add to your cypress.json an environment variable pointing at the API
28+
* ```json
29+
* {
30+
* "baseUrl": "http://localhost:3000",
31+
* "env": {
32+
* "codeCoverage": {
33+
* "api": "http://localhost:4000/__coverage__"
34+
* }
35+
* }
36+
* }
37+
* ```
2538
*
2639
* @param {import('@hapi/hapi').Server} server
2740
*/
2841
module.exports = (server) => {
42+
if (!isCoverageEnabled()) {
43+
debug('skipping hapi middleware, code coverage is not enabled')
44+
return
45+
}
46+
47+
const { takePreciseCoverage } = require('../lib/register/v8Interface')
48+
2949
// expose "GET __coverage__" endpoint that just returns
3050
// global coverage information (if the application has been instrumented)
3151

@@ -34,15 +54,8 @@ module.exports = (server) => {
3454
method: 'GET',
3555
path: '/__coverage__',
3656
async handler() {
37-
if (!isCoverageEnabled()) {
38-
return {
39-
coverage: null
40-
}
41-
}
42-
43-
const { getCoverage } = require('../lib/register/getCoverage')
4457

45-
return { coverage: (await getCoverage()) || null }
58+
return { coverage: (await takePreciseCoverage()) || null }
4659
}
4760
})
4861
}

middleware/koa.js

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,50 @@
11
// @ts-check
22
const { isCoverageEnabled } = require('../lib/common/isEnabled')
3+
const { debug } = require('../lib/common/common-utils');
34

45
/**
56
* for Express.js
67
*
78
* @example Use like
9+
*
810
* ```ts
911
* require('cypress-code-coverage-v8/register');
1012
* const Koa = require('koa')
1113
* const app = new Koa();
1214
* // @see https://github.com/rohit-gohri/cypress-code-coverage-v8
1315
* require('cypress-code-coverage-v8/middleware/koa')(app)
1416
* ```
17+
*
18+
* Then add to your cypress.json an environment variable pointing at the API
19+
* ```json
20+
* {
21+
* "baseUrl": "http://localhost:3000",
22+
* "env": {
23+
* "codeCoverage": {
24+
* "api": "http://localhost:4000/__coverage__"
25+
* }
26+
* }
27+
* }
28+
* ```
1529
*
1630
* @param {import('koa')} app
1731
*/
1832
module.exports = (app) => {
33+
if (!isCoverageEnabled()) {
34+
debug('skipping koa middleware, code coverage is not enabled')
35+
return
36+
}
37+
38+
const { takePreciseCoverage } = require('../lib/register/v8Interface')
1939
// expose "GET __coverage__" endpoint that just returns
2040
// global coverage information (if the application has been instrumented)
2141
app.use(async (ctx, next) => {
2242
if (ctx.path !== '/__coverage__' && ctx.method !== 'GET') {
2343
return next()
2444
}
2545

26-
if (!isCoverageEnabled()) {
27-
ctx.body = {
28-
coverage: null
29-
}
30-
return
31-
}
32-
33-
const { getCoverage } = require('../lib/register/getCoverage')
3446
ctx.body = {
35-
coverage: (await getCoverage()) || null
47+
coverage: (await takePreciseCoverage()) || null
3648
}
3749
})
3850
}

middleware/nextjs.js

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,50 @@
1+
// @ts-check
12
const { isCoverageEnabled } = require('../lib/common/isEnabled')
23

4+
if (isCoverageEnabled()) {
5+
require('../lib/register/register-node')
6+
}
7+
38
/**
49
* Middleware for returning server-side code coverage
510
* for Next.js API route. To use, create new `pages/api/coverage.js` file
611
* and re-export this default middleware function.
712
*
8-
```
9-
// in your pages/api/coverage.js
10-
module.exports = require('cypress-code-coverage-v8/middleware/nextjs')
11-
12-
// then add to your cypress.json an environment variable pointing at the API
13-
{
14-
"baseUrl": "http://localhost:3000",
15-
"env": {
16-
"codeCoverage": {
17-
"url": "/api/coverage"
18-
}
19-
}
20-
}
21-
```
13+
* @example in your pages/api/coverage.js
14+
* ```ts
15+
* module.exports = require('cypress-code-coverage-v8/middleware/nextjs')
16+
* ```
17+
*
18+
* Then add to your cypress.json an environment variable pointing at the API
19+
* ```json
20+
* {
21+
* "baseUrl": "http://localhost:3000",
22+
* "env": {
23+
* "codeCoverage": {
24+
* "ssr": "/api/coverage"
25+
* }
26+
* }
27+
* }
28+
* ```
2229
*
2330
* @see https://nextjs.org/docs#api-routes
2431
* @see https://github.com/rohit-gohri/cypress-code-coverage-v8
32+
*
33+
* @param {import('next').NextApiRequest} _req
34+
* @param {import('next').NextApiResponse} res
2535
*/
26-
module.exports = async function returnCodeCoverageNext(req, res) {
36+
module.exports = async function returnCodeCoverageNext(_req, res) {
2737
if (!isCoverageEnabled()) {
2838
res.status(200).json({
2939
coverage: null
3040
})
3141
return
3242
}
3343

34-
const { getCoverage } = require('../lib/register/getCoverage')
44+
const { takePreciseCoverage } = require('../lib/register/v8Interface')
3545

3646
// only GET is supported
3747
res.status(200).json({
38-
coverage: (await getCoverage()) || null
48+
coverage: (await takePreciseCoverage()) || null
3949
})
4050
}

0 commit comments

Comments
 (0)