diff --git a/bin/run-headless b/bin/run-headless index bc4be47..d685e13 100755 --- a/bin/run-headless +++ b/bin/run-headless @@ -39,8 +39,8 @@ function main() { }); } -main(); - process.on('unhandledRejection', err => { throw err; }); + +main(); diff --git a/index.js b/index.js index a05b4ef..547432f 100644 --- a/index.js +++ b/index.js @@ -1,8 +1,7 @@ +const fs = require('fs'); +const path = require('path'); const puppeteer = require('puppeteer'); -const CLOSE_GLOBAL = '__close__'; -const COVERAGE_GLOBAL = '__coverage__'; - const defaultHtml = ` @@ -40,14 +39,29 @@ function onError(err) { throw err; } -async function run({html, script, url}) { +async function writeCoverage(page) { + const coverage = await page.waitForFunction('window.__coverage__'); + const output = await coverage.jsonValue(); + + // Filter out irrelevant coverage output. + // https://github.com/artberri/rollup-plugin-istanbul/issues/9 + Object.keys(output).forEach(key => { + if (!key.includes(path.sep)) { + delete output[key]; + } + }); + + fs.writeFileSync( + path.join(process.cwd(), '.nyc_output', `${Date.now()}.json`), + JSON.stringify(output), + 'utf8' + ); +} + +async function runHeadless({html, script, url}) { html = String(html || defaultHtml); script = String(script || ''); - if (script && !script.includes(CLOSE_GLOBAL)) { - script += `;window.${CLOSE_GLOBAL}();`; - } - const browser = await puppeteer.launch(); const page = await browser.newPage(); @@ -55,22 +69,11 @@ async function run({html, script, url}) { page.on('error', onError); page.on('pageerror', onError); - const done = new Promise(async resolve => { - async function close() { - if (global[COVERAGE_GLOBAL]) { - Object.assign( - global[COVERAGE_GLOBAL], - await page.waitForFunction(`window.${COVERAGE_GLOBAL}`) - ); - } - - await browser.close(); - - resolve(); - } - - await page.exposeFunction(CLOSE_GLOBAL, close); + const closed = new Promise(async resolve => { + await page.exposeFunction('__close__', resolve); + }); + const done = new Promise(async resolve => { if (url) { await page.goto(url, {waitUntil: 'networkidle0'}); } else { @@ -80,6 +83,16 @@ async function run({html, script, url}) { if (script) { await page.addScriptTag({content: script}); } + + await closed; + + if (script && script.includes('__coverage__')) { + await writeCoverage(page); + } + + await browser.close(); + + resolve(); }); done.browser = browser; @@ -88,4 +101,4 @@ async function run({html, script, url}) { return done; } -module.exports = run; +module.exports = runHeadless; diff --git a/package-lock.json b/package-lock.json index 26f4b27..1daecc6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "run-headless", - "version": "1.0.0-8", + "version": "1.0.0-9", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -326,6 +326,15 @@ "tweetnacl": "0.14.5" } }, + "blue-tape": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/blue-tape/-/blue-tape-1.0.0.tgz", + "integrity": "sha1-dYHQTAc5XJXEJrLtbR7bRUp2uSs=", + "dev": true, + "requires": { + "tape": "4.8.0" + } + }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", diff --git a/package.json b/package.json index a2366a3..444802a 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "run-headless", - "version": "1.0.0-9", + "version": "1.0.0-10", "description": "The easiest way of running code in a modern headless browser environment.", "scripts": { - "test": "run-s test-*", - "test-node": "nyc tape test/index.js | tap-diff", + "test": "nyc run-s test-*", + "test-node": "tape test/index.js | tap-diff", "test-browser": "browserify test/index.js | bin/run-headless | tap-diff", - "test-url": "bin/run-headless --url 'https://google.com' --script 'console.log(document.title)'", + "test-url": "bin/run-headless --url 'https://google.com' --script 'console.log(document.title);window.__close__()'", "report": "nyc report -r text-lcov | coveralls", "pretest": "xo --fix", "precommit": "npm run test && git add .", @@ -31,6 +31,7 @@ "puppeteer": "^1.0.0" }, "devDependencies": { + "blue-tape": "^1.0.0", "browserify": "^15.2.0", "coveralls": "^3.0.0", "husky": "^0.14.3", diff --git a/test/index.js b/test/index.js index d80eb9d..d891db9 100644 --- a/test/index.js +++ b/test/index.js @@ -1,12 +1,16 @@ -const tape = require('tape'); +const test = require('blue-tape'); const close = require('../close'); const foo = require('./foo.js'); const bar = require('./bar.js'); -tape('should sum numbers', t => { +test('should sum numbers', async t => { t.equal(foo + bar, 3); t.comment('hello from test'); - t.end(); }); -tape.onFinish(close); +test('should sum numbers again', async t => { + t.equal(foo + bar, 3); + t.comment('hello from test'); +}); + +test.onFinish(close);