Comparing version 1.0.1 to 2.0.0
104
bin/c8.js
#!/usr/bin/env node | ||
'use strict' | ||
const argv = require('yargs').parse() | ||
const foreground = require('foreground-child') | ||
const sw = require('spawn-wrap') | ||
const CRI = require('chrome-remote-interface') | ||
const Exclude = require('test-exclude') | ||
const {isAbsolute} = require('path') | ||
const mkdirp = require('mkdirp') | ||
const report = require('../lib/report') | ||
const {resolve} = require('path') | ||
const rimraf = require('rimraf') | ||
const spawn = require('../lib/spawn') | ||
const uuid = require('uuid') | ||
const v8ToIstanbul = require('v8-to-istanbul') | ||
const {writeFileSync} = require('fs') | ||
const { | ||
hideInstrumenteeArgs, | ||
hideInstrumenterArgs, | ||
yargs | ||
} = require('../lib/parse-args') | ||
if (argv._.length) { | ||
sw([require.resolve('./wrap')]) | ||
foreground(process.argv.slice(2)) | ||
const instrumenterArgs = hideInstrumenteeArgs() | ||
const argv = yargs.parse(instrumenterArgs) | ||
const exclude = Exclude({ | ||
include: argv.include, | ||
exclude: argv.exclude | ||
}) | ||
;(async function executeWithCoverage (instrumenteeArgv) { | ||
try { | ||
const bin = instrumenteeArgv.shift() | ||
const info = await spawn(bin, | ||
[`--inspect-brk=0`].concat(instrumenteeArgv)) | ||
const client = await CRI({port: info.port}) | ||
const initialPause = new Promise((resolve) => { | ||
client.once('Debugger.paused', resolve) | ||
}) | ||
const mainContextInfo = new Promise((resolve) => { | ||
client.once('Runtime.executionContextCreated', (message) => { | ||
resolve(message.context) | ||
}) | ||
}) | ||
const executionComplete = new Promise((resolve) => { | ||
client.on('Runtime.executionContextDestroyed', async (message) => { | ||
if (message.executionContextId === (await mainContextInfo).id) { | ||
resolve(message) | ||
} | ||
}) | ||
}) | ||
const {Debugger, Runtime, Profiler} = client | ||
await Promise.all([ | ||
Profiler.enable(), | ||
Runtime.enable(), | ||
Debugger.enable(), | ||
Profiler.startPreciseCoverage({callCount: true, detailed: true}), | ||
Runtime.runIfWaitingForDebugger(), | ||
initialPause | ||
]) | ||
await Debugger.resume() | ||
await executionComplete | ||
const allV8Coverage = await collectV8Coverage(Profiler) | ||
writeIstanbulFormatCoverage(allV8Coverage) | ||
await client.close() | ||
report({ | ||
reporter: Array.isArray(argv.reporter) ? argv.reporter : [argv.reporter], | ||
coverageDirectory: argv.coverageDirectory, | ||
watermarks: argv.watermarks | ||
}) | ||
} catch (err) { | ||
console.error(err) | ||
process.exit(1) | ||
} | ||
})(hideInstrumenterArgs(argv)) | ||
async function collectV8Coverage (Profiler) { | ||
let {result} = await Profiler.takePreciseCoverage() | ||
result = result.filter(({url}) => { | ||
url = url.replace('file://', '') | ||
return isAbsolute(url) && exclude.shouldInstrument(url) | ||
}) | ||
return result | ||
} | ||
function writeIstanbulFormatCoverage (allV8Coverage) { | ||
const tmpDirctory = resolve(argv.coverageDirectory, './tmp') | ||
rimraf.sync(tmpDirctory) | ||
mkdirp.sync(tmpDirctory) | ||
allV8Coverage.forEach((v8) => { | ||
const script = v8ToIstanbul(v8.url) | ||
script.applyCoverage(v8.functions) | ||
writeFileSync( | ||
resolve(tmpDirctory, `./${uuid.v4()}.json`), | ||
JSON.stringify(script.toIstanbul(), null, 2), | ||
'utf8' | ||
) | ||
}) | ||
} |
@@ -5,2 +5,24 @@ # Change Log | ||
<a name="2.0.0"></a> | ||
# [2.0.0](https://github.com/bcoe/c8/compare/v1.0.1...v2.0.0) (2017-12-17) | ||
### Bug Fixes | ||
* tweak inspector event timing ([#6](https://github.com/bcoe/c8/issues/6)) ([01f654e](https://github.com/bcoe/c8/commit/01f654e)) | ||
### Features | ||
* first pass at functional prototype without subprocess support ([#5](https://github.com/bcoe/c8/issues/5)) ([9534f56](https://github.com/bcoe/c8/commit/9534f56)) | ||
* implement Istanbul reporting ([#8](https://github.com/bcoe/c8/issues/8)) ([8e430bf](https://github.com/bcoe/c8/commit/8e430bf)) | ||
* switch to stderr and default port ([#7](https://github.com/bcoe/c8/issues/7)) ([bb117b7](https://github.com/bcoe/c8/commit/bb117b7)) | ||
### BREAKING CHANGES | ||
* dropped subprocess support for the time being, while we march towards an initial implementation. | ||
<a name="1.0.1"></a> | ||
@@ -7,0 +29,0 @@ ## [1.0.1](https://github.com/bcoe/c8/compare/v1.0.0...v1.0.1) (2017-10-26) |
{ | ||
"name": "c8", | ||
"version": "1.0.1", | ||
"description": "collect test coverage using v8's profiler", | ||
"version": "2.0.0", | ||
"description": "collect test coverage using v8's inspector", | ||
"main": "index.js", | ||
"bin": "./bin/c8.js", | ||
"scripts": { | ||
"test": "nyc mocha test.js", | ||
"test": "./bin/c8.js node ./node_modules/.bin/_mocha ./test/*.js", | ||
"posttest": "standard", | ||
"release": "standard-version" | ||
}, | ||
"c8": { | ||
"exclude": [ | ||
"test/*.js" | ||
] | ||
}, | ||
"standard": { | ||
"ignore": [ | ||
"test/fixtures" | ||
] | ||
}, | ||
"keywords": [ | ||
@@ -26,10 +37,20 @@ "coverage", | ||
"chrome-remote-interface": "^0.25.2", | ||
"foreground-child": "^1.5.6", | ||
"get-port": "^3.2.0", | ||
"spawn-wrap": "=1.3.8", | ||
"yargs": "^10.0.3" | ||
"find-up": "^2.1.0", | ||
"istanbul-lib-coverage": "^1.1.1", | ||
"istanbul-lib-report": "^1.1.2", | ||
"istanbul-reports": "^1.1.3", | ||
"mkdirp": "^0.5.1", | ||
"rimraf": "^2.6.2", | ||
"test-exclude": "^4.1.1", | ||
"uuid": "^3.1.0", | ||
"v8-to-istanbul": "^1.2.0", | ||
"yargs": "^10.0.3", | ||
"yargs-parser": "^8.0.0" | ||
}, | ||
"devDependencies": { | ||
"chai": "^4.1.2", | ||
"mocha": "^4.0.1", | ||
"standard": "^10.0.3", | ||
"standard-version": "^4.2.0" | ||
} | ||
} |
# c8 - native v8 code-coverage | ||
Code-coverage using [v8's Profiler](https://nodejs.org/dist/latest-v8.x/docs/api/inspector.html) | ||
Code-coverage using [v8's Inspector](https://nodejs.org/dist/latest-v8.x/docs/api/inspector.html) | ||
that's compatible with [Istanbul's reporters](https://istanbul.js.org/docs/advanced/alternative-reporters/). | ||
Like [nyc](https://github.com/istanbuljs/nyc), c8 just magically works, simply: | ||
Like [nyc](https://github.com/istanbuljs/nyc), c8 just magically works: | ||
@@ -13,15 +13,22 @@ ```bash | ||
The above example will collect coverage for `foo.js` using v8's profiler. | ||
The above example will collect coverage for `foo.js` using v8's inspector. | ||
TODO: | ||
## remaining work | ||
- [ ] write logic for converting v8 coverage output to [Istanbul Coverage.json format](https://github.com/gotwarlost/istanbul/blob/master/coverage.json.md). | ||
- [ ] talk to Node.js project about silencing messages: | ||
- [x] write logic for converting v8 coverage output to [Istanbul Coverage.json format](https://github.com/gotwarlost/istanbul/blob/master/coverage.json.md). | ||
* https://github.com/bcoe/v8-to-istanbul | ||
- [ ] talk to node.js project about silencing messages: | ||
> `Debugger listening on ws://127.0.0.1:56399/e850110a-c5df-41d8-8ef2-400f6829617f`. | ||
- [ ] figure out why `detailed` mode does not appear to be working. | ||
- [ ] figure out a better way to determine that all processes in event loop | ||
- [x] figure out why `detailed` mode does not appear to be working. | ||
* this is fixed in v8, as long as you start with `--inspect-brk` you | ||
can collect coverage in detailed mode. | ||
- [x] figure out a better way to determine that all processes in event loop | ||
have terminated (except the inspector session). | ||
- [ ] process.exit() can't perform an async operation; how can we track coverage | ||
- [x] process.exit() can't perform an async operation; how can we track coverage | ||
for scripts that exit? | ||
* we can now listen for the `Runtime.executionContextDestroyed` event. | ||
- [x] figure out why instrumentation of .mjs files does not work: | ||
* see: https://github.com/nodejs/node/issues/17336 |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
Debug access
Supply chain riskUses debug, reflection and dynamic code execution features.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Debug access
Supply chain riskUses debug, reflection and dynamic code execution features.
Found 1 instance in 1 package
11489
8
221
34
12
4
6
2
+ Addedfind-up@^2.1.0
+ Addedistanbul-lib-coverage@^1.1.1
+ Addedistanbul-lib-report@^1.1.2
+ Addedistanbul-reports@^1.1.3
+ Addedmkdirp@^0.5.1
+ Addedrimraf@^2.6.2
+ Addedtest-exclude@^4.1.1
+ Addeduuid@^3.1.0
+ Addedv8-to-istanbul@^1.2.0
+ Addedyargs-parser@^8.0.0
+ Addedarr-diff@2.0.0(transitive)
+ Addedarr-flatten@1.1.0(transitive)
+ Addedarray-unique@0.2.1(transitive)
+ Addedarrify@1.0.1(transitive)
+ Addedbalanced-match@1.0.2(transitive)
+ Addedbrace-expansion@1.1.11(transitive)
+ Addedbraces@1.8.5(transitive)
+ Addedconcat-map@0.0.1(transitive)
+ Addederror-ex@1.3.2(transitive)
+ Addedexpand-brackets@0.1.5(transitive)
+ Addedexpand-range@1.8.2(transitive)
+ Addedextglob@0.3.2(transitive)
+ Addedfilename-regex@2.0.1(transitive)
+ Addedfill-range@2.2.4(transitive)
+ Addedfind-up@1.1.2(transitive)
+ Addedfor-in@1.0.2(transitive)
+ Addedfor-own@0.1.5(transitive)
+ Addedfs.realpath@1.0.0(transitive)
+ Addedfunction-bind@1.1.2(transitive)
+ Addedglob@7.2.3(transitive)
+ Addedglob-base@0.3.0(transitive)
+ Addedglob-parent@2.0.0(transitive)
+ Addedgraceful-fs@4.2.11(transitive)
+ Addedhandlebars@4.7.8(transitive)
+ Addedhas-flag@1.0.0(transitive)
+ Addedhasown@2.0.2(transitive)
+ Addedhosted-git-info@2.8.9(transitive)
+ Addedinflight@1.0.6(transitive)
+ Addedinherits@2.0.4(transitive)
+ Addedis-arrayish@0.2.1(transitive)
+ Addedis-buffer@1.1.6(transitive)
+ Addedis-core-module@2.15.1(transitive)
+ Addedis-dotfile@1.0.3(transitive)
+ Addedis-equal-shallow@0.1.3(transitive)
+ Addedis-extendable@0.1.1(transitive)
+ Addedis-extglob@1.0.0(transitive)
+ Addedis-glob@2.0.1(transitive)
+ Addedis-number@2.1.04.0.0(transitive)
+ Addedis-posix-bracket@0.1.1(transitive)
+ Addedis-primitive@2.0.0(transitive)
+ Addedis-utf8@0.2.1(transitive)
+ Addedisarray@1.0.0(transitive)
+ Addedisobject@2.1.0(transitive)
+ Addedistanbul-lib-coverage@1.2.1(transitive)
+ Addedistanbul-lib-report@1.1.5(transitive)
+ Addedistanbul-reports@1.5.1(transitive)
+ Addedkind-of@3.2.26.0.3(transitive)
+ Addedload-json-file@1.1.0(transitive)
+ Addedmath-random@1.0.4(transitive)
+ Addedmicromatch@2.3.11(transitive)
+ Addedminimatch@3.1.2(transitive)
+ Addedminimist@1.2.8(transitive)
+ Addedmkdirp@0.5.6(transitive)
+ Addedneo-async@2.6.2(transitive)
+ Addednormalize-package-data@2.5.0(transitive)
+ Addednormalize-path@2.1.1(transitive)
+ Addedobject-assign@4.1.1(transitive)
+ Addedobject.omit@2.0.1(transitive)
+ Addedonce@1.4.0(transitive)
+ Addedparse-glob@3.0.4(transitive)
+ Addedparse-json@2.2.0(transitive)
+ Addedpath-exists@2.1.0(transitive)
+ Addedpath-is-absolute@1.0.1(transitive)
+ Addedpath-parse@1.0.7(transitive)
+ Addedpath-type@1.1.0(transitive)
+ Addedpify@2.3.0(transitive)
+ Addedpinkie@2.0.4(transitive)
+ Addedpinkie-promise@2.0.1(transitive)
+ Addedpreserve@0.2.0(transitive)
+ Addedrandomatic@3.1.1(transitive)
+ Addedread-pkg@1.1.0(transitive)
+ Addedread-pkg-up@1.0.1(transitive)
+ Addedregex-cache@0.4.4(transitive)
+ Addedremove-trailing-separator@1.1.0(transitive)
+ Addedrepeat-element@1.1.4(transitive)
+ Addedrepeat-string@1.6.1(transitive)
+ Addedresolve@1.22.8(transitive)
+ Addedrimraf@2.7.1(transitive)
+ Addedsemver@5.7.2(transitive)
+ Addedsource-map@0.6.1(transitive)
+ Addedspdx-correct@3.2.0(transitive)
+ Addedspdx-exceptions@2.5.0(transitive)
+ Addedspdx-expression-parse@3.0.1(transitive)
+ Addedspdx-license-ids@3.0.20(transitive)
+ Addedstrip-bom@2.0.0(transitive)
+ Addedsupports-color@3.2.3(transitive)
+ Addedsupports-preserve-symlinks-flag@1.0.0(transitive)
+ Addedtest-exclude@4.2.3(transitive)
+ Addeduglify-js@3.19.3(transitive)
+ Addeduuid@3.4.0(transitive)
+ Addedv8-to-istanbul@1.2.1(transitive)
+ Addedvalidate-npm-package-license@3.0.4(transitive)
+ Addedwordwrap@1.0.0(transitive)
+ Addedwrappy@1.0.2(transitive)
- Removedforeground-child@^1.5.6
- Removedget-port@^3.2.0
- Removedspawn-wrap@=1.3.8
- Removedcross-spawn@4.0.2(transitive)
- Removedforeground-child@1.5.6(transitive)
- Removedget-port@3.2.0(transitive)